tx · GZimgHcdbPNpBBjH8Pque7HKwwUd7FMekniimPBTyazv

3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB:  -0.05000000 Waves

2021.08.19 16:57 [1665319] smart account 3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB > SELF 0.00000000 Waves

{ "type": 13, "id": "GZimgHcdbPNpBBjH8Pque7HKwwUd7FMekniimPBTyazv", "fee": 5000000, "feeAssetId": null, "timestamp": 1629381435750, "version": 2, "chainId": 84, "sender": "3MvCLdwRiQSNrhgumfFunsbyUJUw6ViTMwB", "senderPublicKey": "9Vbnf3b9hhuCerzPXf38mLo8mUGTPNVW3jtQRbymjaSw", "proofs": [ "2aK6qHZLUbysEW3ZWaeZjrHkb3zxCefV5U5rhmRNtLDsaXkDKtz7Gb7WPrgdAftmAXLp64HFHceJWd7N5biZFwac" ], "script": "base64:AAIFAAAAAAAAADoIAhIGCgQBAQEBEgMKAQESAwoBARIDCgEBEgMKAQESAwoBARIECgIBCBIFCgMBCAgSAwoBARIDCgEBAAAALAAAAAAQaW5jdWJhdG9yQWRkcmVzcwEAAAAaAVQu1YzRxAHn1ekAzs1AJJ6xFAc06V7PK6oAAAAADmJyZWVkZXJBZGRyZXNzAQAAABoBVC7VjNHEAefV6QDOzUAknrEUBzTpXs8rqgAAAAAOZmFybWluZ0FkZHJlc3MBAAAAGgFU8jY5wCvKx9IdZ1jq9byeNi+peiAgajPTAAAAAAtlZ2dzQXNzZXRJZAEAAAAgJQJlzPcEaMi+AVmReOVYWjhmFBOtSkxKt/4FF0gXFoMAAAAACG1ha2VyRmVlAAAAAAAAAAABAAAAAAh0YWtlckZlZQAAAAAAAAAAAQAAAAAFU0xPVFMAAAAAAAAAAAoAAAAAB1dBSVRJTkcAAAAAAAAAAAUAAAAADHN0ZXBEdXJhdGlvbgAAAAAAAAAAAwEAAAANdHJ5R2V0SW50ZWdlcgAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiAAAAAAAAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAA10cnlHZXRCb29sZWFuAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiBwEAAAANZ2V0TmV4dEdhbWVJZAAAAAAEAAAABm5leHRJZAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAAxuZXh0X2dhbWVfaWQDCQAAAAAAAAIFAAAABm5leHRJZAAAAAAAAAAAAAAAAAAAAAAAAQUAAAAGbmV4dElkAQAAABVnZXRVc2VyQ3VycmVudEdhbWVLZXkAAAABAAAAB2FkZHJlc3MJAAEsAAAAAgIAAAANY3VycmVudF9nYW1lXwUAAAAHYWRkcmVzcwEAAAASZ2V0VXNlckN1cnJlbnRHYW1lAAAAAQAAAAdhZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABVnZXRVc2VyQ3VycmVudEdhbWVLZXkAAAABBQAAAAdhZGRyZXNzAQAAAApnZXRTbG90S2V5AAAAAQAAAARzbG90CQABLAAAAAICAAAABXNsb3RfCQABpAAAAAEFAAAABHNsb3QBAAAAB2dldFNsb3QAAAABAAAABHNsb3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAACmdldFNsb3RLZXkAAAABBQAAAARzbG90AQAAAA9nZXRHYW1lTWFrZXJLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABWdhbWVfCQABpAAAAAEFAAAABmdhbWVJZAIAAAAGX21ha2VyAQAAAAxnZXRHYW1lTWFrZXIAAAABAAAABmdhbWVJZAkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAA9nZXRHYW1lTWFrZXJLZXkAAAABBQAAAAZnYW1lSWQBAAAAD2dldEdhbWVUYWtlcktleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAZfdGFrZXIBAAAADGdldEdhbWVUYWtlcgAAAAEAAAAGZ2FtZUlkCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAD2dldEdhbWVUYWtlcktleQAAAAEFAAAABmdhbWVJZAEAAAANZ2V0QmV0RWdnc0tleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAlfYmV0X2VnZ3MBAAAACmdldEJldEVnZ3MAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAANZ2V0QmV0RWdnc0tleQAAAAEFAAAABmdhbWVJZAEAAAAaZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHRLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABWdhbWVfCQABpAAAAAEFAAAABmdhbWVJZAIAAAATX3dhaXRpbmdfZW5kX2hlaWdodAEAAAAXZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHQAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAaZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAFGdldEdhbWVPdmVySGVpZ2h0S2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAADF9vdmVyX2hlaWdodAEAAAARZ2V0R2FtZU92ZXJIZWlnaHQAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAaZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAFWdldEdhbWVSYXJpdHlSYW5nZUtleQAAAAIAAAAGZ2FtZUlkAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABWdhbWVfCQABpAAAAAEFAAAABmdhbWVJZAIAAAANX3Jhcml0eVJhbmdlXwUAAAANcmFuZ2VQb3NpdGlvbgEAAAASZ2V0R2FtZVJhcml0eVJhbmdlAAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAVZ2V0R2FtZVJhcml0eVJhbmdlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1yYW5nZVBvc2l0aW9uAQAAAA5nZXRHYW1lU3RlcEtleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAVfc3RlcAEAAAALZ2V0R2FtZVN0ZXAAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAOZ2V0R2FtZVN0ZXBLZXkAAAABBQAAAAZnYW1lSWQBAAAADGdldFJhcml0eUtleQAAAAMAAAAGZ2FtZUlkAAAABnBsYXllcgAAAA1yYW5nZVBvc2l0aW9uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAABnBsYXllcgIAAAABXwUAAAANcmFuZ2VQb3NpdGlvbgIAAAAGUmFyaXR5AQAAAAlnZXRSYXJpdHkAAAADAAAABmdhbWVJZAAAAAZwbGF5ZXIAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAMZ2V0UmFyaXR5S2V5AAAAAwUAAAAGZ2FtZUlkBQAAAAZwbGF5ZXIFAAAADXJhbmdlUG9zaXRpb24BAAAADGdldENvbW1pdEtleQAAAAIAAAAGZ2FtZUlkAAAABnBsYXllcgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAVnYW1lXwkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAABnBsYXllcgIAAAAHX2NvbW1pdAEAAAAJZ2V0Q29tbWl0AAAAAgAAAAZnYW1lSWQAAAAGcGxheWVyCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAADGdldENvbW1pdEtleQAAAAIFAAAABmdhbWVJZAUAAAAGcGxheWVyAQAAAA9nZXREdWNrT3JkZXJLZXkAAAACAAAABmdhbWVJZAAAAAZwbGF5ZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAFZ2FtZV8JAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAAZwbGF5ZXICAAAACl9kdWNrT3JkZXIBAAAADGdldER1Y2tPcmRlcgAAAAIAAAAGZ2FtZUlkAAAABnBsYXllcgkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAA9nZXREdWNrT3JkZXJLZXkAAAACBQAAAAZnYW1lSWQFAAAABnBsYXllcgEAAAAPZ2V0UHJpemVTZW50S2V5AAAAAgAAAAZnYW1lSWQAAAAGcGxheWVyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABWdhbWVfCQABpAAAAAEFAAAABmdhbWVJZAIAAAABXwUAAAAGcGxheWVyAgAAAA9fd2l0aGRyYXdTdGF0dXMBAAAADGdldFByaXplU2VudAAAAAIAAAAGZ2FtZUlkAAAABnBsYXllcgkBAAAADXRyeUdldEJvb2xlYW4AAAABCQEAAAAPZ2V0UHJpemVTZW50S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAAZwbGF5ZXIBAAAACHBpY2tEdWNrAAAABwAAAAZnYW1lSWQAAAAKcGxheWVyUm9sZQAAAA1wbGF5ZXJBZGRyZXNzAAAAB2Fzc2V0SWQAAAAGcmFyaXR5AAAADXJhbmdlUG9zaXRpb24AAAAEc3RlcAQAAAALcmFyaXR5UmFuZ2UJAQAAABJnZXRHYW1lUmFyaXR5UmFuZ2UAAAACBQAAAAZnYW1lSWQFAAAADXJhbmdlUG9zaXRpb24DAwMDCQAAAAAAAAIFAAAAC3Jhcml0eVJhbmdlAAAAAAAAAAAFCQAAZgAAAAIAAAAAAAAAACgFAAAABnJhcml0eQcGCQAAZwAAAAIFAAAABnJhcml0eQkAAGgAAAACBQAAAAtyYXJpdHlSYW5nZQAAAAAAAAAACgYJAABmAAAAAgkAAGgAAAACCQAAZQAAAAIFAAAAC3Jhcml0eVJhbmdlAAAAAAAAAAABAAAAAAAAAAAKBQAAAAZyYXJpdHkJAAACAAAAAQIAAAAmVGhpcyBkdWNrIGRvZXNuJ3QgZml0IHRoZSByYXJpdHkgcmFuZ2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxnZXRSYXJpdHlLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUFAAAADXJhbmdlUG9zaXRpb24FAAAABnJhcml0eQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADmdldEdhbWVTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAABHN0ZXAAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRnZXRHYW1lT3ZlckhlaWdodEtleQAAAAEFAAAABmdhbWVJZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAADHN0ZXBEdXJhdGlvbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA1wbGF5ZXJBZGRyZXNzAAAAAAAAAAABBQAAAAdhc3NldElkBQAAAANuaWwBAAAACGdldFNjb3JlAAAAAgAAAAFhAAAAAWIDCQAAZgAAAAIFAAAAAWEFAAAAAWIAAAAAAAAAAAEDCQAAZgAAAAIFAAAAAWIFAAAAAWEA//////////8AAAAAAAAAAAABAAAACWdldFdpbm5lcgAAAAEAAAAGZ2FtZUlkBAAAAA5tYWtlckR1Y2tPcmRlcgkABLUAAAACCQEAAAAMZ2V0RHVja09yZGVyAAAAAgUAAAAGZ2FtZUlkAgAAAAVtYWtlcgIAAAABLAQAAAAOdGFrZXJEdWNrT3JkZXIJAAS1AAAAAgkBAAAADGdldER1Y2tPcmRlcgAAAAIFAAAABmdhbWVJZAIAAAAFdGFrZXICAAAAASwEAAAADG1ha2VyUmFyaXR5MQkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFbWFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAAEAAAADG1ha2VyUmFyaXR5MgkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFbWFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAEEAAAADG1ha2VyUmFyaXR5MwkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFbWFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAIEAAAADHRha2VyUmFyaXR5MQkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFdGFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAAEAAAADHRha2VyUmFyaXR5MgkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFdGFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAEEAAAADHRha2VyUmFyaXR5MwkBAAAACWdldFJhcml0eQAAAAMFAAAABmdhbWVJZAIAAAAFdGFrZXIJAAGRAAAAAgUAAAAObWFrZXJEdWNrT3JkZXIAAAAAAAAAAAIEAAAACm1ha2VyU2NvcmUJAABkAAAAAgkAAGQAAAACCQEAAAAIZ2V0U2NvcmUAAAACBQAAAAxtYWtlclJhcml0eTEFAAAADHRha2VyUmFyaXR5MQkBAAAACGdldFNjb3JlAAAAAgUAAAAMbWFrZXJSYXJpdHkyBQAAAAx0YWtlclJhcml0eTIJAQAAAAhnZXRTY29yZQAAAAIFAAAADG1ha2VyUmFyaXR5MwUAAAAMdGFrZXJSYXJpdHkzAwkAAGYAAAACBQAAAAptYWtlclNjb3JlAAAAAAAAAAAAAgAAAAVtYWtlcgMJAABmAAAAAgAAAAAAAAAAAAUAAAAKbWFrZXJTY29yZQIAAAAFdGFrZXICAAAABGRyYXcBAAAAEGdldFdpbm5lckV4cGlyZWQAAAABAAAACGdhbWVTdGVwAwMDAwMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAAGCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAADBgkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAABAYJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAcGCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAAJAgAAAAVtYWtlcgMDAwMDCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAABBgkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAAAgYJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAUGCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAAGBgkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAACAIAAAAFdGFrZXICAAAABGRyYXcBAAAACXNlbmRQcml6ZQAAAAQAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MAAAAKcGxheWVyUm9sZQAAAAZ3aW5uZXIDCQEAAAAMZ2V0UHJpemVTZW50AAAAAgUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlCQAAAgAAAAECAAAAHllvdSBoYXZlIGFscmVhZHkgZ290IHRoZSBwcml6ZQMJAAAAAAAAAgUAAAAGd2lubmVyBQAAAApwbGF5ZXJSb2xlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAPZ2V0UHJpemVTZW50S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlBgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA1wbGF5ZXJBZGRyZXNzCQAAaAAAAAIJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkAAAAAAAAAAACBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsAwkAAAAAAAACBQAAAAZ3aW5uZXICAAAABGRyYXcJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAAA9nZXRQcml6ZVNlbnRLZXkAAAACBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAADXBsYXllckFkZHJlc3MJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsCQAAAgAAAAECAAAAIVlvdSBsb3NlIGFuZCBkb24ndCBoYXZlIGFueSBwcml6ZQAAAAoAAAABaQEAAAAIbWFrZUdhbWUAAAAEAAAABHNsb3QAAAAQcmFyaXR5UmFuZ2VXb3JzdAAAABFyYXJpdHlSYW5nZU1lZGl1bQAAAA9yYXJpdHlSYW5nZUJlc3QEAAAADWNhbGxlckFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAKc2xvdEdhbWVJZAkBAAAAB2dldFNsb3QAAAABBQAAAARzbG90BAAAAAdwYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAARlZ2dzCQAAZQAAAAIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAIbWFrZXJGZWUEAAAABmdhbWVJZAkBAAAADWdldE5leHRHYW1lSWQAAAAAAwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAALZWdnc0Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAADZZb3UgY2FuIGF0dGFjaCBvbmx5IEVHR3Mgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJAAJYAAAAAQUAAAALZWdnc0Fzc2V0SWQDCQAAZwAAAAIAAAAAAAAAAAAFAAAABGVnZ3MJAAACAAAAAQIAAAAPTm90IGVub3VnaCBFR0dzAwkBAAAAAiE9AAAAAgkBAAAAEmdldFVzZXJDdXJyZW50R2FtZQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAJAAACAAAAAQIAAAAfWW91IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgZ2FtZQMDCQAAZgAAAAIAAAAAAAAAAAAFAAAABHNsb3QGCQAAZwAAAAIFAAAABHNsb3QFAAAABVNMT1RTCQAAAgAAAAECAAAADEludmFsaWQgc2xvdAMJAQAAAAIhPQAAAAIFAAAACnNsb3RHYW1lSWQAAAAAAAAAAAAJAAACAAAAAQIAAAARVGhpcyBzbG90IGlzIGJ1c3kDAwkAAGYAAAACAAAAAAAAAAABBQAAABByYXJpdHlSYW5nZVdvcnN0BgkAAGYAAAACBQAAABByYXJpdHlSYW5nZVdvcnN0AAAAAAAAAAAFCQAAAgAAAAECAAAAJ0ludmFsaWQgcmFyaXR5IHJhbmdlIGZvciB0aGUgd29yc3QgZHVjawMDCQAAZgAAAAIAAAAAAAAAAAEFAAAAEXJhcml0eVJhbmdlTWVkaXVtBgkAAGYAAAACBQAAABFyYXJpdHlSYW5nZU1lZGl1bQAAAAAAAAAABQkAAAIAAAABAgAAAChJbnZhbGlkIHJhcml0eSByYW5nZSBmb3IgdGhlIG1lZGl1bSBkdWNrAwMJAABmAAAAAgAAAAAAAAAAAQUAAAAPcmFyaXR5UmFuZ2VCZXN0BgkAAGYAAAACBQAAAA9yYXJpdHlSYW5nZUJlc3QAAAAAAAAAAAUJAAACAAAAAQIAAAAmSW52YWxpZCByYXJpdHkgcmFuZ2UgZm9yIHRoZSBiZXN0IGR1Y2sDCQAAZwAAAAIFAAAAEHJhcml0eVJhbmdlV29yc3QFAAAAEXJhcml0eVJhbmdlTWVkaXVtCQAAAgAAAAECAAAAMVRoZSBtZWRpdW0gZHVjayBtdXN0IGJlIGJldHRlciB0aGFuIHRoZSB3b3JzdCBvbmUDCQAAZwAAAAIFAAAAEXJhcml0eVJhbmdlTWVkaXVtBQAAAA9yYXJpdHlSYW5nZUJlc3QJAAACAAAAAQIAAAAwVGhlIGJlc3QgZHVjayBtdXN0IGJlIGJldHRlciB0aGFuIHRoZSBtZWRpdW0gb25lCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0VXNlckN1cnJlbnRHYW1lS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwUAAAAGZ2FtZUlkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXRHYW1lTWFrZXJLZXkAAAABBQAAAAZnYW1lSWQFAAAADWNhbGxlckFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA1nZXRCZXRFZ2dzS2V5AAAAAQUAAAAGZ2FtZUlkBQAAAARlZ2dzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0R2FtZVJhcml0eVJhbmdlS2V5AAAAAgUAAAAGZ2FtZUlkAgAAAAV3b3JzdAUAAAAQcmFyaXR5UmFuZ2VXb3JzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWdldEdhbWVSYXJpdHlSYW5nZUtleQAAAAIFAAAABmdhbWVJZAIAAAAGbWVkaXVtBQAAABFyYXJpdHlSYW5nZU1lZGl1bQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWdldEdhbWVSYXJpdHlSYW5nZUtleQAAAAIFAAAABmdhbWVJZAIAAAAEYmVzdAUAAAAPcmFyaXR5UmFuZ2VCZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAaZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAAdXQUlUSU5HCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKZ2V0U2xvdEtleQAAAAEFAAAABHNsb3QFAAAABmdhbWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAMbmV4dF9nYW1lX2lkCQAAZAAAAAIFAAAABmdhbWVJZAAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAACHRha2VHYW1lAAAAAQAAAARzbG90BAAAAA1jYWxsZXJBZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAABmdhbWVJZAkBAAAAB2dldFNsb3QAAAABBQAAAARzbG90BAAAAAdwYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkAAAAAAAACCQEAAAAHZ2V0U2xvdAAAAAEFAAAABHNsb3QAAAAAAAAAAAAJAAACAAAAAQIAAAASVGhpcyBzbG90IGlzIGVtcHR5AwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAALZWdnc0Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAADxZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJAAJYAAAAAQUAAAALZWdnc0Fzc2V0SWQDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAABkAAAAAgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQFAAAACHRha2VyRmVlCQAAAgAAAAECAAAAGEluc3VmZmljaWVudCBlZ2dzIGFtb3VudAMJAQAAAAIhPQAAAAIJAQAAAAxnZXRHYW1lVGFrZXIAAAABBQAAAAZnYW1lSWQCAAAAAAkAAAIAAAABAgAAABpUaGlzIGdhbWUgaXMgYWxyZWFkeSB0YWtlbgMJAABnAAAAAgUAAAAGaGVpZ2h0CQEAAAAXZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHQAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAUVGhpcyBnYW1lIGlzIGV4cGlyZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVnZXRVc2VyQ3VycmVudEdhbWVLZXkAAAABBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAZnYW1lSWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldEdhbWVUYWtlcktleQAAAAEFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFGdldEdhbWVPdmVySGVpZ2h0S2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAABmhlaWdodAUAAAAMc3RlcER1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKZ2V0U2xvdEtleQAAAAEFAAAABHNsb3QAAAAAAAAAAAAFAAAAA25pbAAAAAFpAQAAAAhraWNrR2FtZQAAAAEAAAAEc2xvdAQAAAAGZ2FtZUlkCQEAAAAHZ2V0U2xvdAAAAAEFAAAABHNsb3QDAwkAAGYAAAACAAAAAAAAAAAABQAAAARzbG90BgkAAGcAAAACBQAAAARzbG90BQAAAAVTTE9UUwkAAAIAAAABAgAAAAxJbnZhbGlkIHNsb3QDCQAAAAAAAAIFAAAABmdhbWVJZAAAAAAAAAAAAAkAAAIAAAABAgAAAA1TbG90IGlzIGVtcHR5AwkAAGYAAAACCQEAAAAXZ2V0R2FtZVdhaXRpbmdFbmRIZWlnaHQAAAABBQAAAAZnYW1lSWQFAAAABmhlaWdodAkAAAIAAAABAgAAABtXYWl0aW5nIGlzIG5vdCBmaW5pc2hlZCB5ZXQDCQEAAAACIT0AAAACCQEAAAAMZ2V0R2FtZVRha2VyAAAAAQUAAAAGZ2FtZUlkAgAAAAAJAAACAAAAAQIAAAAUVGhpcyBnYW1lIGlzIHN0YXJ0ZWQEAAAABW1ha2VyCQEAAAAMZ2V0R2FtZU1ha2VyAAAAAQUAAAAGZ2FtZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0VXNlckN1cnJlbnRHYW1lS2V5AAAAAQUAAAAFbWFrZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAApnZXRTbG90S2V5AAAAAQUAAAAEc2xvdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAGbAAAAAQUAAAAFbWFrZXIJAABkAAAAAgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQFAAAACG1ha2VyRmVlBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAADXBpY2tXb3JzdER1Y2sAAAABAAAABmdhbWVJZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwMJAQAAAAIhPQAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAB2Fzc2V0SWQAAAAGaXNzdWVyCQEAAAAHQWRkcmVzcwAAAAEFAAAADmJyZWVkZXJBZGRyZXNzCQEAAAACIT0AAAACCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABmlzc3VlcgkBAAAAB0FkZHJlc3MAAAABBQAAABBpbmN1YmF0b3JBZGRyZXNzBwkAAAIAAAABAgAAAAtJbnZhbGlkIE5GVAMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAADCQEAAAACIT0AAAACBQAAAA1jYWxsZXJBZGRyZXNzCQEAAAAMZ2V0R2FtZVRha2VyAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAIkl0IGlzIHRoZSB0YWtlcidzIHR1cm4gdG8gcGljayBub3cEAAAACWludm9rZVJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAADmZhcm1pbmdBZGRyZXNzAgAAABZnZXRBc3NldFJhcml0eUNhbGxhYmxlCQAETAAAAAIFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAlpbnZva2VSZXMFAAAACWludm9rZVJlcwQAAAAGcmFyaXR5BAAAAAckbWF0Y2gwBQAAAAlpbnZva2VSZXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABcgUAAAAHJG1hdGNoMAUAAAABcgkAAAIAAAABAgAAABdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkBAAAACHBpY2tEdWNrAAAABwUAAAAGZ2FtZUlkAgAAAAV0YWtlcggFAAAAAWkAAAAGY2FsbGVyBQAAAAdhc3NldElkBQAAAAZyYXJpdHkCAAAABXdvcnN0AAAAAAAAAAAACQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAEDCQEAAAACIT0AAAACBQAAAA1jYWxsZXJBZGRyZXNzCQEAAAAMZ2V0R2FtZU1ha2VyAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAIkl0IGlzIHRoZSBtYWtlcidzIHR1cm4gdG8gcGljayBub3cEAAAACWludm9rZVJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAADmZhcm1pbmdBZGRyZXNzAgAAABZnZXRBc3NldFJhcml0eUNhbGxhYmxlCQAETAAAAAIFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAlpbnZva2VSZXMFAAAACWludm9rZVJlcwQAAAAGcmFyaXR5BAAAAAckbWF0Y2gwBQAAAAlpbnZva2VSZXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABcgUAAAAHJG1hdGNoMAUAAAABcgkAAAIAAAABAgAAABdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkBAAAACHBpY2tEdWNrAAAABwUAAAAGZ2FtZUlkAgAAAAVtYWtlcggFAAAAAWkAAAAGY2FsbGVyBQAAAAdhc3NldElkBQAAAAZyYXJpdHkCAAAABXdvcnN0AAAAAAAAAAABCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACZUaGUgd29yc3QgZHVjayBoYXMgYWxyZWFkeSBiZWVuIHBpY2tlZAAAAAFpAQAAAA9waWNrTWVkaXVtdER1Y2sAAAABAAAABmdhbWVJZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwMJAQAAAAIhPQAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAB2Fzc2V0SWQAAAAGaXNzdWVyCQEAAAAHQWRkcmVzcwAAAAEFAAAADmJyZWVkZXJBZGRyZXNzCQEAAAACIT0AAAACCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABmlzc3VlcgkBAAAAB0FkZHJlc3MAAAABBQAAABBpbmN1YmF0b3JBZGRyZXNzBwkAAAIAAAABAgAAAAtJbnZhbGlkIE5GVAMJAABmAAAAAgAAAAAAAAAAAgUAAAAIZ2FtZVN0ZXAJAAACAAAAAQIAAAAyVGhlIG1lZGl1bSBkdWNrIG11c3QgYmUgcGlja2VkIGFmdGVyIHRoZSB3b3JzdCBvbmUDCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAACAwkBAAAAAiE9AAAAAgUAAAANY2FsbGVyQWRkcmVzcwkBAAAADGdldEdhbWVNYWtlcgAAAAEFAAAABmdhbWVJZAkAAAIAAAABAgAAACJJdCBpcyB0aGUgbWFrZXIncyB0dXJuIHRvIHBpY2sgbm93BAAAAAlpbnZva2VSZXMJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABBQAAAA5mYXJtaW5nQWRkcmVzcwIAAAAWZ2V0QXNzZXRSYXJpdHlDYWxsYWJsZQkABEwAAAACBQAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAJaW52b2tlUmVzBQAAAAlpbnZva2VSZXMEAAAABnJhcml0eQQAAAAHJG1hdGNoMAUAAAAJaW52b2tlUmVzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXIFAAAAByRtYXRjaDAFAAAAAXIJAAACAAAAAQIAAAAXSW5jb3JyZWN0IGludm9rZSByZXN1bHQJAQAAAAhwaWNrRHVjawAAAAcFAAAABmdhbWVJZAIAAAAFbWFrZXIIBQAAAAFpAAAABmNhbGxlcgUAAAAHYXNzZXRJZAUAAAAGcmFyaXR5AgAAAAZtZWRpdW0AAAAAAAAAAAIJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAAAwMJAQAAAAIhPQAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lVGFrZXIAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAiSXQgaXMgdGhlIHRha2VyJ3MgdHVybiB0byBwaWNrIG5vdwQAAAAJaW52b2tlUmVzCQAD/AAAAAQJAQAAAAdBZGRyZXNzAAAAAQUAAAAOZmFybWluZ0FkZHJlc3MCAAAAFmdldEFzc2V0UmFyaXR5Q2FsbGFibGUJAARMAAAAAgUAAAAHYXNzZXRJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACWludm9rZVJlcwUAAAAJaW52b2tlUmVzBAAAAAZyYXJpdHkEAAAAByRtYXRjaDAFAAAACWludm9rZVJlcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAAAAECAAAAF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQEAAAAIcGlja0R1Y2sAAAAHBQAAAAZnYW1lSWQCAAAABXRha2VyCAUAAAABaQAAAAZjYWxsZXIFAAAAB2Fzc2V0SWQFAAAABnJhcml0eQIAAAAGbWVkaXVtAAAAAAAAAAADCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACdUaGUgbWVkaXVtIGR1Y2sgaGFzIGFscmVhZHkgYmVlbiBwaWNrZWQAAAABaQEAAAAMcGlja0Jlc3REdWNrAAAAAQAAAAZnYW1lSWQEAAAADWNhbGxlckFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAHYXNzZXRJZAkBAAAABXZhbHVlAAAAAQgJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAIZ2FtZVN0ZXAJAQAAAAtnZXRHYW1lU3RlcAAAAAEFAAAABmdhbWVJZAMDCQEAAAACIT0AAAACCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAdhc3NldElkAAAABmlzc3VlcgkBAAAAB0FkZHJlc3MAAAABBQAAAA5icmVlZGVyQWRkcmVzcwkBAAAAAiE9AAAAAggJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAHYXNzZXRJZAAAAAZpc3N1ZXIJAQAAAAdBZGRyZXNzAAAAAQUAAAAQaW5jdWJhdG9yQWRkcmVzcwcJAAACAAAAAQIAAAALSW52YWxpZCBORlQDCQAAZgAAAAIAAAAAAAAAAAQFAAAACGdhbWVTdGVwCQAAAgAAAAECAAAAQFRoZSBiZXN0IGR1Y2sgbXVzdCBiZSBwaWNrZWQgYWZ0ZXIgdGhlIHdvcnN0IGFuZCB0aGUgbWVkaXVtIG9uZXMDCQAAAAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAAEAwkBAAAAAiE9AAAAAgUAAAANY2FsbGVyQWRkcmVzcwkBAAAADGdldEdhbWVUYWtlcgAAAAEFAAAABmdhbWVJZAkAAAIAAAABAgAAACJJdCBpcyB0aGUgdGFrZXIncyB0dXJuIHRvIHBpY2sgbm93BAAAAAlpbnZva2VSZXMJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABBQAAAA5mYXJtaW5nQWRkcmVzcwIAAAAWZ2V0QXNzZXRSYXJpdHlDYWxsYWJsZQkABEwAAAACBQAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAJaW52b2tlUmVzBQAAAAlpbnZva2VSZXMEAAAABnJhcml0eQQAAAAHJG1hdGNoMAUAAAAJaW52b2tlUmVzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXIFAAAAByRtYXRjaDAFAAAAAXIJAAACAAAAAQIAAAAXSW5jb3JyZWN0IGludm9rZSByZXN1bHQJAQAAAAhwaWNrRHVjawAAAAcFAAAABmdhbWVJZAIAAAAFdGFrZXIIBQAAAAFpAAAABmNhbGxlcgUAAAAHYXNzZXRJZAUAAAAGcmFyaXR5AgAAAARiZXN0AAAAAAAAAAAECQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAUDCQEAAAACIT0AAAACBQAAAA1jYWxsZXJBZGRyZXNzCQEAAAAMZ2V0R2FtZU1ha2VyAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAIkl0IGlzIHRoZSBtYWtlcidzIHR1cm4gdG8gcGljayBub3cEAAAACWludm9rZVJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAADmZhcm1pbmdBZGRyZXNzAgAAABZnZXRBc3NldFJhcml0eUNhbGxhYmxlCQAETAAAAAIFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAlpbnZva2VSZXMFAAAACWludm9rZVJlcwQAAAAGcmFyaXR5BAAAAAckbWF0Y2gwBQAAAAlpbnZva2VSZXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABcgUAAAAHJG1hdGNoMAUAAAABcgkAAAIAAAABAgAAABdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkBAAAACHBpY2tEdWNrAAAABwUAAAAGZ2FtZUlkAgAAAAVtYWtlcggFAAAAAWkAAAAGY2FsbGVyBQAAAAdhc3NldElkBQAAAAZyYXJpdHkCAAAABGJlc3QAAAAAAAAAAAUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJVRoZSBiZXN0IGR1Y2sgaGFzIGFscmVhZHkgYmVlbiBwaWNrZWQAAAABaQEAAAAGY29tbWl0AAAAAgAAAAZnYW1lSWQAAAAEaGFzaAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwkAAGYAAAACAAAAAAAAAAAGBQAAAAhnYW1lU3RlcAkAAAIAAAABAgAAABxEdWNrcyBoYXNuJ3QgYmVlbiBwaWNrZWQgeWV0AwkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAABgMJAQAAAAIhPQAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lTWFrZXIAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAkSXQgaXMgdGhlIG1ha2VyJ3MgdHVybiB0byBjb21taXQgbm93CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxnZXRDb21taXRLZXkAAAACBQAAAAZnYW1lSWQCAAAABW1ha2VyBQAAAARoYXNoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOZ2V0R2FtZVN0ZXBLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRnZXRHYW1lT3ZlckhlaWdodEtleQAAAAEFAAAABmdhbWVJZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAADHN0ZXBEdXJhdGlvbgUAAAADbmlsAwkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAABwMJAQAAAAIhPQAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lVGFrZXIAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAkSXQgaXMgdGhlIHRha2VyJ3MgdHVybiB0byBjb21taXQgbm93CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxnZXRDb21taXRLZXkAAAACBQAAAAZnYW1lSWQCAAAABXRha2VyBQAAAARoYXNoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOZ2V0R2FtZVN0ZXBLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRnZXRHYW1lT3ZlckhlaWdodEtleQAAAAEFAAAABmdhbWVJZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAADHN0ZXBEdXJhdGlvbgUAAAADbmlsCQAAAgAAAAECAAAAEkNvbW1pdCBpcyBmaW5pc2hlZAAAAAFpAQAAAAZyZXZlYWwAAAADAAAABmdhbWVJZAAAAAlkdWNrT3JkZXIAAAAEc2FsdAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwkAAGYAAAACAAAAAAAAAAAIBQAAAAhnYW1lU3RlcAkAAAIAAAABAgAAABVSZXZlYWwgaXMgbm90IHN0YXJ0ZWQDAwMDAwMJAQAAAAIhPQAAAAIFAAAACWR1Y2tPcmRlcgIAAAARd29yc3QsbWVkaXVtLGJlc3QGCQEAAAACIT0AAAACBQAAAAlkdWNrT3JkZXICAAAAEXdvcnN0LGJlc3QsbWVkaXVtBgkBAAAAAiE9AAAAAgUAAAAJZHVja09yZGVyAgAAABFtZWRpdW0sd29yc3QsYmVzdAYJAQAAAAIhPQAAAAIFAAAACWR1Y2tPcmRlcgIAAAARbWVkaXVtLGJlc3Qsd29yc3QGCQEAAAACIT0AAAACBQAAAAlkdWNrT3JkZXICAAAAEWJlc3Qsd29yc3QsbWVkaXVtBgkBAAAAAiE9AAAAAgUAAAAJZHVja09yZGVyAgAAABFiZXN0LG1lZGl1bSx3b3JzdAkAAAIAAAABAgAAABFJbnZhbGlkIGR1Y2tPcmRlcgMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAgDCQEAAAACIT0AAAACBQAAAA1jYWxsZXJBZGRyZXNzCQEAAAAMZ2V0R2FtZU1ha2VyAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAJEl0IGlzIHRoZSBtYWtlcidzIHR1cm4gdG8gcmV2ZWFsIG5vdwMJAQAAAAIhPQAAAAIJAAJYAAAAAQkAAfcAAAABCQABmwAAAAEJAAEsAAAAAgUAAAAJZHVja09yZGVyBQAAAARzYWx0CQEAAAAJZ2V0Q29tbWl0AAAAAgUAAAAGZ2FtZUlkAgAAAAVtYWtlcgkAAAIAAAABAgAAABhyZXZlYWwgZGF0YSBpcyBub3QgdmFsaWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldER1Y2tPcmRlcktleQAAAAIFAAAABmdhbWVJZAIAAAAFbWFrZXIFAAAACWR1Y2tPcmRlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADmdldEdhbWVTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUZ2V0R2FtZU92ZXJIZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAAxzdGVwRHVyYXRpb24FAAAAA25pbAMJAAAAAAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAkDCQEAAAACIT0AAAACBQAAAA1jYWxsZXJBZGRyZXNzCQEAAAAMZ2V0R2FtZVRha2VyAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAJEl0IGlzIHRoZSB0YWtlcidzIHR1cm4gdG8gcmV2ZWFsIG5vdwMJAQAAAAIhPQAAAAIJAAJYAAAAAQkAAfcAAAABCQABmwAAAAEJAAEsAAAAAgUAAAAJZHVja09yZGVyBQAAAARzYWx0CQEAAAAJZ2V0Q29tbWl0AAAAAgUAAAAGZ2FtZUlkAgAAAAV0YWtlcgkAAAIAAAABAgAAABhyZXZlYWwgZGF0YSBpcyBub3QgdmFsaWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldER1Y2tPcmRlcktleQAAAAIFAAAABmdhbWVJZAIAAAAFdGFrZXIFAAAACWR1Y2tPcmRlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADmdldEdhbWVTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUZ2V0R2FtZU92ZXJIZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAAxzdGVwRHVyYXRpb24FAAAAA25pbAkAAAIAAAABAgAAABJSZXZlYWwgaXMgZmluaXNoZWQAAAABaQEAAAAIZ2V0UHJpemUAAAABAAAABmdhbWVJZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwkBAAAAAiE9AAAAAgUAAAAIZ2FtZVN0ZXAAAAAAAAAAAAoJAAACAAAAAQIAAAAUR2FtZSBpcyBub3QgZmluaXNoZWQDCQAAAAAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lTWFrZXIAAAABBQAAAAZnYW1lSWQJAQAAAAlzZW5kUHJpemUAAAAEBQAAAAZnYW1lSWQIBQAAAAFpAAAABmNhbGxlcgIAAAAFbWFrZXIJAQAAAAlnZXRXaW5uZXIAAAABBQAAAAZnYW1lSWQDCQAAAAAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lVGFrZXIAAAABBQAAAAZnYW1lSWQJAQAAAAlzZW5kUHJpemUAAAAEBQAAAAZnYW1lSWQIBQAAAAFpAAAABmNhbGxlcgIAAAAFdGFrZXIJAQAAAAlnZXRXaW5uZXIAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAWSW52YWxpZCBjYWxsZXIgYWRkcmVzcwAAAAFpAQAAAA9nZXRQcml6ZUV4cGlyZWQAAAABAAAABmdhbWVJZAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhnYW1lU3RlcAkBAAAAC2dldEdhbWVTdGVwAAAAAQUAAAAGZ2FtZUlkAwkAAAAAAAACBQAAAAhnYW1lU3RlcAAAAAAAAAAACgkAAAIAAAABAgAAACdHYW1lIGlzIGZpbmlzaGVkLCBjYWxsIGdldFByaXplIGluc3RlYWQDCQAAZgAAAAIJAQAAABFnZXRHYW1lT3ZlckhlaWdodAAAAAEFAAAABmdhbWVJZAUAAAAGaGVpZ2h0CQAAAgAAAAECAAAAE0dhbWUgaXMgbm90IGV4cGlyZWQDCQAAAAAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lTWFrZXIAAAABBQAAAAZnYW1lSWQJAQAAAAlzZW5kUHJpemUAAAAEBQAAAAZnYW1lSWQIBQAAAAFpAAAABmNhbGxlcgIAAAAFbWFrZXIJAQAAABBnZXRXaW5uZXJFeHBpcmVkAAAAAQUAAAAIZ2FtZVN0ZXADCQAAAAAAAAIFAAAADWNhbGxlckFkZHJlc3MJAQAAAAxnZXRHYW1lVGFrZXIAAAABBQAAAAZnYW1lSWQJAQAAAAlzZW5kUHJpemUAAAAEBQAAAAZnYW1lSWQIBQAAAAFpAAAABmNhbGxlcgIAAAAFdGFrZXIJAQAAABBnZXRXaW5uZXJFeHBpcmVkAAAAAQUAAAAIZ2FtZVN0ZXAJAAACAAAAAQIAAAAWSW52YWxpZCBjYWxsZXIgYWRkcmVzcwAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5FnoUuw==", "height": 1665319, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Y4n6CNaHLGhmgic5CfGH5Ux1MEDL2j2swvX64QS4odX Next: BPGo8qUvMF5T7MunpBFCoRcWvzUhxfCAUPtFu9Et3Pgc Diff:
OldNewDifferences
209209 let gameId = getNextGameId()
210210 if ((payment.assetId != eggsAssetId))
211211 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
212- else if ((0 > eggs))
212+ else if ((0 >= eggs))
213213 then throw("Not enough EGGs")
214- else if ((eggs == 0))
215- then throw("You can't bet 0 EGGs")
216- else if ((getUserCurrentGame(callerAddress) != 0))
217- then throw("You already have an active game")
218- else if (if ((0 > slot))
219- then true
220- else (slot >= SLOTS))
221- then throw("Invalid slot")
222- else if ((slotGameId != 0))
223- then throw("This slot is busy")
224- else if (if ((1 > rarityRangeWorst))
214+ else if ((getUserCurrentGame(callerAddress) != 0))
215+ then throw("You already have an active game")
216+ else if (if ((0 > slot))
217+ then true
218+ else (slot >= SLOTS))
219+ then throw("Invalid slot")
220+ else if ((slotGameId != 0))
221+ then throw("This slot is busy")
222+ else if (if ((1 > rarityRangeWorst))
223+ then true
224+ else (rarityRangeWorst > 5))
225+ then throw("Invalid rarity range for the worst duck")
226+ else if (if ((1 > rarityRangeMedium))
225227 then true
226- else (rarityRangeWorst > 5))
227- then throw("Insufficient rarity range for the worst duck")
228- else if (if ((1 > rarityRangeMedium))
228+ else (rarityRangeMedium > 5))
229+ then throw("Invalid rarity range for the medium duck")
230+ else if (if ((1 > rarityRangeBest))
229231 then true
230- else (rarityRangeMedium > 5))
231- then throw("Insufficient rarity range for the medium duck")
232- else if (if ((1 > rarityRangeBest))
233- then true
234- else (rarityRangeBest > 5))
235- then throw("Insufficient rarity range for the best duck")
236- else if ((rarityRangeWorst >= rarityRangeMedium))
237- then throw("The medium duck must be better than the worst one")
238- else if ((rarityRangeMedium >= rarityRangeBest))
239- then throw("The best duck must be better than the medium one")
240- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
232+ else (rarityRangeBest > 5))
233+ then throw("Invalid rarity range for the best duck")
234+ else if ((rarityRangeWorst >= rarityRangeMedium))
235+ then throw("The medium duck must be better than the worst one")
236+ else if ((rarityRangeMedium >= rarityRangeBest))
237+ then throw("The best duck must be better than the medium one")
238+ else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
241239 }
242240
243241
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let incubatorAddress = base58'3MtBigTsaeevrcJAEwVcr4quwkqcrtnjoAh'
55
66 let breederAddress = base58'3MtBigTsaeevrcJAEwVcr4quwkqcrtnjoAh'
77
88 let farmingAddress = base58'3NBznG19rEYUAcnukTRTtwJHBVKQLbobVdC'
99
1010 let eggsAssetId = base58'3VUCuh9dWqe54SdzzNUkXhFXpc8UQynnJVh42B7MjNzN'
1111
1212 let makerFee = 1
1313
1414 let takerFee = 1
1515
1616 let SLOTS = 10
1717
1818 let WAITING = 5
1919
2020 let stepDuration = 3
2121
2222 func tryGetInteger (key) = match getInteger(this, key) {
2323 case b: Int =>
2424 b
2525 case _ =>
2626 0
2727 }
2828
2929
3030 func tryGetString (key) = match getString(this, key) {
3131 case a: String =>
3232 a
3333 case _ =>
3434 ""
3535 }
3636
3737
3838 func tryGetBoolean (key) = match getBoolean(this, key) {
3939 case b: Boolean =>
4040 b
4141 case _ =>
4242 false
4343 }
4444
4545
4646 func getNextGameId () = {
4747 let nextId = tryGetInteger("next_game_id")
4848 if ((nextId == 0))
4949 then 1
5050 else nextId
5151 }
5252
5353
5454 func getUserCurrentGameKey (address) = ("current_game_" + address)
5555
5656
5757 func getUserCurrentGame (address) = tryGetInteger(getUserCurrentGameKey(address))
5858
5959
6060 func getSlotKey (slot) = ("slot_" + toString(slot))
6161
6262
6363 func getSlot (slot) = tryGetInteger(getSlotKey(slot))
6464
6565
6666 func getGameMakerKey (gameId) = (("game_" + toString(gameId)) + "_maker")
6767
6868
6969 func getGameMaker (gameId) = tryGetString(getGameMakerKey(gameId))
7070
7171
7272 func getGameTakerKey (gameId) = (("game_" + toString(gameId)) + "_taker")
7373
7474
7575 func getGameTaker (gameId) = tryGetString(getGameTakerKey(gameId))
7676
7777
7878 func getBetEggsKey (gameId) = (("game_" + toString(gameId)) + "_bet_eggs")
7979
8080
8181 func getBetEggs (gameId) = tryGetInteger(getBetEggsKey(gameId))
8282
8383
8484 func getGameWaitingEndHeightKey (gameId) = (("game_" + toString(gameId)) + "_waiting_end_height")
8585
8686
8787 func getGameWaitingEndHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
8888
8989
9090 func getGameOverHeightKey (gameId) = (("game_" + toString(gameId)) + "_over_height")
9191
9292
9393 func getGameOverHeight (gameId) = tryGetInteger(getGameWaitingEndHeightKey(gameId))
9494
9595
9696 func getGameRarityRangeKey (gameId,rangePosition) = ((("game_" + toString(gameId)) + "_rarityRange_") + rangePosition)
9797
9898
9999 func getGameRarityRange (gameId,rangePosition) = tryGetInteger(getGameRarityRangeKey(gameId, rangePosition))
100100
101101
102102 func getGameStepKey (gameId) = (("game_" + toString(gameId)) + "_step")
103103
104104
105105 func getGameStep (gameId) = tryGetInteger(getGameStepKey(gameId))
106106
107107
108108 func getRarityKey (gameId,player,rangePosition) = (((((("game_" + toString(gameId)) + "_") + player) + "_") + rangePosition) + "Rarity")
109109
110110
111111 func getRarity (gameId,player,rangePosition) = tryGetInteger(getRarityKey(gameId, player, rangePosition))
112112
113113
114114 func getCommitKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_commit")
115115
116116
117117 func getCommit (gameId,player) = tryGetString(getCommitKey(gameId, player))
118118
119119
120120 func getDuckOrderKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_duckOrder")
121121
122122
123123 func getDuckOrder (gameId,player) = tryGetString(getDuckOrderKey(gameId, player))
124124
125125
126126 func getPrizeSentKey (gameId,player) = (((("game_" + toString(gameId)) + "_") + player) + "_withdrawStatus")
127127
128128
129129 func getPrizeSent (gameId,player) = tryGetBoolean(getPrizeSentKey(gameId, player))
130130
131131
132132 func pickDuck (gameId,playerRole,playerAddress,assetId,rarity,rangePosition,step) = {
133133 let rarityRange = getGameRarityRange(gameId, rangePosition)
134134 if (if (if (if ((rarityRange == 5))
135135 then (40 > rarity)
136136 else false)
137137 then true
138138 else (rarity >= (rarityRange * 10)))
139139 then true
140140 else (((rarityRange - 1) * 10) > rarity))
141141 then throw("This duck doesn't fit the rarity range")
142142 else [IntegerEntry(getRarityKey(gameId, playerRole, rangePosition), rarity), IntegerEntry(getGameStepKey(gameId), (step + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), ScriptTransfer(playerAddress, 1, assetId)]
143143 }
144144
145145
146146 func getScore (a,b) = if ((a > b))
147147 then 1
148148 else if ((b > a))
149149 then -1
150150 else 0
151151
152152
153153 func getWinner (gameId) = {
154154 let makerDuckOrder = split(getDuckOrder(gameId, "maker"), ",")
155155 let takerDuckOrder = split(getDuckOrder(gameId, "taker"), ",")
156156 let makerRarity1 = getRarity(gameId, "maker", makerDuckOrder[0])
157157 let makerRarity2 = getRarity(gameId, "maker", makerDuckOrder[1])
158158 let makerRarity3 = getRarity(gameId, "maker", makerDuckOrder[2])
159159 let takerRarity1 = getRarity(gameId, "taker", makerDuckOrder[0])
160160 let takerRarity2 = getRarity(gameId, "taker", makerDuckOrder[1])
161161 let takerRarity3 = getRarity(gameId, "taker", makerDuckOrder[2])
162162 let makerScore = ((getScore(makerRarity1, takerRarity1) + getScore(makerRarity2, takerRarity2)) + getScore(makerRarity3, takerRarity3))
163163 if ((makerScore > 0))
164164 then "maker"
165165 else if ((0 > makerScore))
166166 then "taker"
167167 else "draw"
168168 }
169169
170170
171171 func getWinnerExpired (gameStep) = if (if (if (if (if ((gameStep == 0))
172172 then true
173173 else (gameStep == 3))
174174 then true
175175 else (gameStep == 4))
176176 then true
177177 else (gameStep == 7))
178178 then true
179179 else (gameStep == 9))
180180 then "maker"
181181 else if (if (if (if (if ((gameStep == 1))
182182 then true
183183 else (gameStep == 2))
184184 then true
185185 else (gameStep == 5))
186186 then true
187187 else (gameStep == 6))
188188 then true
189189 else (gameStep == 8))
190190 then "taker"
191191 else "draw"
192192
193193
194194 func sendPrize (gameId,playerAddress,playerRole,winner) = if (getPrizeSent(gameId, playerRole))
195195 then throw("You have already got the prize")
196196 else if ((winner == playerRole))
197197 then [BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, (getBetEggs(gameId) * 2), eggsAssetId)]
198198 else if ((winner == "draw"))
199199 then [BooleanEntry(getPrizeSentKey(gameId, playerRole), true), ScriptTransfer(playerAddress, getBetEggs(gameId), eggsAssetId)]
200200 else throw("You lose and don't have any prize")
201201
202202
203203 @Callable(i)
204204 func makeGame (slot,rarityRangeWorst,rarityRangeMedium,rarityRangeBest) = {
205205 let callerAddress = toBase58String(i.caller.bytes)
206206 let slotGameId = getSlot(slot)
207207 let payment = value(i.payments[0])
208208 let eggs = (payment.amount - makerFee)
209209 let gameId = getNextGameId()
210210 if ((payment.assetId != eggsAssetId))
211211 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
212- else if ((0 > eggs))
212+ else if ((0 >= eggs))
213213 then throw("Not enough EGGs")
214- else if ((eggs == 0))
215- then throw("You can't bet 0 EGGs")
216- else if ((getUserCurrentGame(callerAddress) != 0))
217- then throw("You already have an active game")
218- else if (if ((0 > slot))
219- then true
220- else (slot >= SLOTS))
221- then throw("Invalid slot")
222- else if ((slotGameId != 0))
223- then throw("This slot is busy")
224- else if (if ((1 > rarityRangeWorst))
214+ else if ((getUserCurrentGame(callerAddress) != 0))
215+ then throw("You already have an active game")
216+ else if (if ((0 > slot))
217+ then true
218+ else (slot >= SLOTS))
219+ then throw("Invalid slot")
220+ else if ((slotGameId != 0))
221+ then throw("This slot is busy")
222+ else if (if ((1 > rarityRangeWorst))
223+ then true
224+ else (rarityRangeWorst > 5))
225+ then throw("Invalid rarity range for the worst duck")
226+ else if (if ((1 > rarityRangeMedium))
225227 then true
226- else (rarityRangeWorst > 5))
227- then throw("Insufficient rarity range for the worst duck")
228- else if (if ((1 > rarityRangeMedium))
228+ else (rarityRangeMedium > 5))
229+ then throw("Invalid rarity range for the medium duck")
230+ else if (if ((1 > rarityRangeBest))
229231 then true
230- else (rarityRangeMedium > 5))
231- then throw("Insufficient rarity range for the medium duck")
232- else if (if ((1 > rarityRangeBest))
233- then true
234- else (rarityRangeBest > 5))
235- then throw("Insufficient rarity range for the best duck")
236- else if ((rarityRangeWorst >= rarityRangeMedium))
237- then throw("The medium duck must be better than the worst one")
238- else if ((rarityRangeMedium >= rarityRangeBest))
239- then throw("The best duck must be better than the medium one")
240- else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
232+ else (rarityRangeBest > 5))
233+ then throw("Invalid rarity range for the best duck")
234+ else if ((rarityRangeWorst >= rarityRangeMedium))
235+ then throw("The medium duck must be better than the worst one")
236+ else if ((rarityRangeMedium >= rarityRangeBest))
237+ then throw("The best duck must be better than the medium one")
238+ else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameMakerKey(gameId), callerAddress), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getGameRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getGameRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getGameRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getGameWaitingEndHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("next_game_id", (gameId + 1))]
241239 }
242240
243241
244242
245243 @Callable(i)
246244 func takeGame (slot) = {
247245 let callerAddress = toBase58String(i.caller.bytes)
248246 let gameId = getSlot(slot)
249247 let payment = value(i.payments[0])
250248 if ((getSlot(slot) == 0))
251249 then throw("This slot is empty")
252250 else if ((payment.assetId != eggsAssetId))
253251 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
254252 else if ((payment.amount != (getBetEggs(gameId) + takerFee)))
255253 then throw("Insufficient eggs amount")
256254 else if ((getGameTaker(gameId) != ""))
257255 then throw("This game is already taken")
258256 else if ((height >= getGameWaitingEndHeight(gameId)))
259257 then throw("This game is expired")
260258 else [IntegerEntry(getUserCurrentGameKey(callerAddress), gameId), StringEntry(getGameTakerKey(gameId), callerAddress), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0)]
261259 }
262260
263261
264262
265263 @Callable(i)
266264 func kickGame (slot) = {
267265 let gameId = getSlot(slot)
268266 if (if ((0 > slot))
269267 then true
270268 else (slot >= SLOTS))
271269 then throw("Invalid slot")
272270 else if ((gameId == 0))
273271 then throw("Slot is empty")
274272 else if ((getGameWaitingEndHeight(gameId) > height))
275273 then throw("Waiting is not finished yet")
276274 else if ((getGameTaker(gameId) != ""))
277275 then throw("This game is started")
278276 else {
279277 let maker = getGameMaker(gameId)
280278 [IntegerEntry(getUserCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(toBytes(maker)), (getBetEggs(gameId) + makerFee), eggsAssetId)]
281279 }
282280 }
283281
284282
285283
286284 @Callable(i)
287285 func pickWorstDuck (gameId) = {
288286 let callerAddress = toBase58String(i.caller.bytes)
289287 let assetId = value(value(i.payments[0]).assetId)
290288 let gameStep = getGameStep(gameId)
291289 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
292290 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
293291 else false)
294292 then throw("Invalid NFT")
295293 else if ((gameStep == 0))
296294 then if ((callerAddress != getGameTaker(gameId)))
297295 then throw("It is the taker's turn to pick now")
298296 else {
299297 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
300298 if ((invokeRes == invokeRes))
301299 then {
302300 let rarity = match invokeRes {
303301 case r: Int =>
304302 r
305303 case _ =>
306304 throw("Incorrect invoke result")
307305 }
308306 pickDuck(gameId, "taker", i.caller, assetId, rarity, "worst", 0)
309307 }
310308 else throw("Strict value is not equal to itself.")
311309 }
312310 else if ((gameStep == 1))
313311 then if ((callerAddress != getGameMaker(gameId)))
314312 then throw("It is the maker's turn to pick now")
315313 else {
316314 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
317315 if ((invokeRes == invokeRes))
318316 then {
319317 let rarity = match invokeRes {
320318 case r: Int =>
321319 r
322320 case _ =>
323321 throw("Incorrect invoke result")
324322 }
325323 pickDuck(gameId, "maker", i.caller, assetId, rarity, "worst", 1)
326324 }
327325 else throw("Strict value is not equal to itself.")
328326 }
329327 else throw("The worst duck has already been picked")
330328 }
331329
332330
333331
334332 @Callable(i)
335333 func pickMediumtDuck (gameId) = {
336334 let callerAddress = toBase58String(i.caller.bytes)
337335 let assetId = value(value(i.payments[0]).assetId)
338336 let gameStep = getGameStep(gameId)
339337 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
340338 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
341339 else false)
342340 then throw("Invalid NFT")
343341 else if ((2 > gameStep))
344342 then throw("The medium duck must be picked after the worst one")
345343 else if ((gameStep == 2))
346344 then if ((callerAddress != getGameMaker(gameId)))
347345 then throw("It is the maker's turn to pick now")
348346 else {
349347 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
350348 if ((invokeRes == invokeRes))
351349 then {
352350 let rarity = match invokeRes {
353351 case r: Int =>
354352 r
355353 case _ =>
356354 throw("Incorrect invoke result")
357355 }
358356 pickDuck(gameId, "maker", i.caller, assetId, rarity, "medium", 2)
359357 }
360358 else throw("Strict value is not equal to itself.")
361359 }
362360 else if ((gameStep == 3))
363361 then if ((callerAddress != getGameTaker(gameId)))
364362 then throw("It is the taker's turn to pick now")
365363 else {
366364 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
367365 if ((invokeRes == invokeRes))
368366 then {
369367 let rarity = match invokeRes {
370368 case r: Int =>
371369 r
372370 case _ =>
373371 throw("Incorrect invoke result")
374372 }
375373 pickDuck(gameId, "taker", i.caller, assetId, rarity, "medium", 3)
376374 }
377375 else throw("Strict value is not equal to itself.")
378376 }
379377 else throw("The medium duck has already been picked")
380378 }
381379
382380
383381
384382 @Callable(i)
385383 func pickBestDuck (gameId) = {
386384 let callerAddress = toBase58String(i.caller.bytes)
387385 let assetId = value(value(i.payments[0]).assetId)
388386 let gameStep = getGameStep(gameId)
389387 if (if ((value(assetInfo(assetId)).issuer != Address(breederAddress)))
390388 then (value(assetInfo(assetId)).issuer != Address(incubatorAddress))
391389 else false)
392390 then throw("Invalid NFT")
393391 else if ((4 > gameStep))
394392 then throw("The best duck must be picked after the worst and the medium ones")
395393 else if ((gameStep == 4))
396394 then if ((callerAddress != getGameTaker(gameId)))
397395 then throw("It is the taker's turn to pick now")
398396 else {
399397 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
400398 if ((invokeRes == invokeRes))
401399 then {
402400 let rarity = match invokeRes {
403401 case r: Int =>
404402 r
405403 case _ =>
406404 throw("Incorrect invoke result")
407405 }
408406 pickDuck(gameId, "taker", i.caller, assetId, rarity, "best", 4)
409407 }
410408 else throw("Strict value is not equal to itself.")
411409 }
412410 else if ((gameStep == 5))
413411 then if ((callerAddress != getGameMaker(gameId)))
414412 then throw("It is the maker's turn to pick now")
415413 else {
416414 let invokeRes = invoke(Address(farmingAddress), "getAssetRarityCallable", [assetId], nil)
417415 if ((invokeRes == invokeRes))
418416 then {
419417 let rarity = match invokeRes {
420418 case r: Int =>
421419 r
422420 case _ =>
423421 throw("Incorrect invoke result")
424422 }
425423 pickDuck(gameId, "maker", i.caller, assetId, rarity, "best", 5)
426424 }
427425 else throw("Strict value is not equal to itself.")
428426 }
429427 else throw("The best duck has already been picked")
430428 }
431429
432430
433431
434432 @Callable(i)
435433 func commit (gameId,hash) = {
436434 let callerAddress = toBase58String(i.caller.bytes)
437435 let gameStep = getGameStep(gameId)
438436 if ((6 > gameStep))
439437 then throw("Ducks hasn't been picked yet")
440438 else if ((gameStep == 6))
441439 then if ((callerAddress != getGameMaker(gameId)))
442440 then throw("It is the maker's turn to commit now")
443441 else [StringEntry(getCommitKey(gameId, "maker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
444442 else if ((gameStep == 7))
445443 then if ((callerAddress != getGameTaker(gameId)))
446444 then throw("It is the taker's turn to commit now")
447445 else [StringEntry(getCommitKey(gameId, "taker"), hash), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
448446 else throw("Commit is finished")
449447 }
450448
451449
452450
453451 @Callable(i)
454452 func reveal (gameId,duckOrder,salt) = {
455453 let callerAddress = toBase58String(i.caller.bytes)
456454 let gameStep = getGameStep(gameId)
457455 if ((8 > gameStep))
458456 then throw("Reveal is not started")
459457 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
460458 then true
461459 else (duckOrder != "worst,best,medium"))
462460 then true
463461 else (duckOrder != "medium,worst,best"))
464462 then true
465463 else (duckOrder != "medium,best,worst"))
466464 then true
467465 else (duckOrder != "best,worst,medium"))
468466 then true
469467 else (duckOrder != "best,medium,worst"))
470468 then throw("Invalid duckOrder")
471469 else if ((gameStep == 8))
472470 then if ((callerAddress != getGameMaker(gameId)))
473471 then throw("It is the maker's turn to reveal now")
474472 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "maker")))
475473 then throw("reveal data is not valid")
476474 else [StringEntry(getDuckOrderKey(gameId, "maker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
477475 else if ((gameStep == 9))
478476 then if ((callerAddress != getGameTaker(gameId)))
479477 then throw("It is the taker's turn to reveal now")
480478 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, "taker")))
481479 then throw("reveal data is not valid")
482480 else [StringEntry(getDuckOrderKey(gameId, "taker"), duckOrder), IntegerEntry(getGameStepKey(gameId), (gameStep + 1)), IntegerEntry(getGameOverHeightKey(gameId), (height + stepDuration))]
483481 else throw("Reveal is finished")
484482 }
485483
486484
487485
488486 @Callable(i)
489487 func getPrize (gameId) = {
490488 let callerAddress = toBase58String(i.caller.bytes)
491489 let gameStep = getGameStep(gameId)
492490 if ((gameStep != 10))
493491 then throw("Game is not finished")
494492 else if ((callerAddress == getGameMaker(gameId)))
495493 then sendPrize(gameId, i.caller, "maker", getWinner(gameId))
496494 else if ((callerAddress == getGameTaker(gameId)))
497495 then sendPrize(gameId, i.caller, "taker", getWinner(gameId))
498496 else throw("Invalid caller address")
499497 }
500498
501499
502500
503501 @Callable(i)
504502 func getPrizeExpired (gameId) = {
505503 let callerAddress = toBase58String(i.caller.bytes)
506504 let gameStep = getGameStep(gameId)
507505 if ((gameStep == 10))
508506 then throw("Game is finished, call getPrize instead")
509507 else if ((getGameOverHeight(gameId) > height))
510508 then throw("Game is not expired")
511509 else if ((callerAddress == getGameMaker(gameId)))
512510 then sendPrize(gameId, i.caller, "maker", getWinnerExpired(gameStep))
513511 else if ((callerAddress == getGameTaker(gameId)))
514512 then sendPrize(gameId, i.caller, "taker", getWinnerExpired(gameStep))
515513 else throw("Invalid caller address")
516514 }
517515
518516
519517 @Verifier(tx)
520518 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
521519

github/deemru/w8io/169f3d6 
96.94 ms