lpeg 1.0.0 → 1.0.1
raw patch · 8 files changed
+660/−43 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Lua.LPeg: luaopen_re_ptr :: CFunction
Files
- CHANGELOG.md +12/−3
- cbits/placeholder.c +8/−2
- cbits/re.c +10/−0
- cbits/re.h +541/−0
- lpeg.cabal +4/−1
- src/Lua/LPeg.hs +7/−6
- substitute/Lua/LPeg.hs +11/−8
- test/test-lpeg.hs +67/−23
CHANGELOG.md view
@@ -1,11 +1,20 @@ # Changelog -`lua` uses [PVP Versioning][1].+`lpeg` uses [PVP Versioning][1]. +## lpeg 1.0.1++Released 2021-11-08.++ - The 're' package is a Lua script that's part of LPeg. It is now+ included as a byte array in the C sources; a loader function for+ this library is provided, and 're' is now handled by the lpeg+ searcher.+ ## lpeg 1.0.0 -Release pending.+Released 2021-10-31. -- Initially created.+- A wild package appears. [1]: https://pvp.haskell.org
cbits/placeholder.c view
@@ -1,12 +1,18 @@ #include <string.h>- #include "lua.h" int luaopen_lpeg (lua_State *L); int luaopen_lpeg (lua_State *L) {- const char *msg = lua_pushliteral(L, "Non-functional placeholder. Configuration prevented " "the inclusion of the real LPeg package.");+ lua_error(L);+}++int luaopen_re (lua_State *L);+int luaopen_re (lua_State *L)+{+ lua_pushliteral(L, "Non-functional placeholder. Configuration prevented "+ "the inclusion of the real 're' package."); lua_error(L); }
+ cbits/re.c view
@@ -0,0 +1,10 @@+#include "lua.h"+#include "lauxlib.h"+#include "re.h"++int luaopen_re(lua_State *L);+int luaopen_re(lua_State *L) {+ luaL_loadstring(L, cbits_lpeg_1_0_2_re_lua);+ lua_call(L, 0, 1);+ return 1;+}
+ cbits/re.h view
@@ -0,0 +1,541 @@+unsigned char cbits_lpeg_1_0_2_re_lua[] = {+ 0x2d, 0x2d, 0x20, 0x24, 0x49, 0x64, 0x3a, 0x20, 0x72, 0x65, 0x2e, 0x6c,+ 0x75, 0x61, 0x20, 0x24, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x69, 0x6d, 0x70,+ 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,+ 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x64, 0x75,+ 0x6c, 0x65, 0x73, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f,+ 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65,+ 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72,+ 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65,+ 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x69,+ 0x6e, 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x6c, 0x6f,+ 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74,+ 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65,+ 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,+ 0x65, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, 0x0a, 0x0a, 0x2d, 0x2d, 0x20,+ 0x27, 0x6d, 0x27, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,+ 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x73,+ 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,+ 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x6d, 0x6d, 0x27, 0x20,+ 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,+ 0x20, 0x74, 0x6f, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74,+ 0x65, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,+ 0x73, 0x3b, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20,+ 0x27, 0x72, 0x65, 0x27, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, 0x6f, 0x6e,+ 0x20, 0x27, 0x6d, 0x27, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69,+ 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x0a,+ 0x2d, 0x2d, 0x20, 0x6f, 0x6e, 0x20, 0x27, 0x6d, 0x6d, 0x27, 0x0a, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6d, 0x20, 0x3d, 0x20, 0x6d, 0x0a,+ 0x0a, 0x2d, 0x2d, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x27,+ 0x73, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67,+ 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28,+ 0x6d, 0x6d, 0x2e, 0x50, 0x28, 0x30, 0x29, 0x29, 0x0a, 0x0a, 0x0a, 0x0a,+ 0x2d, 0x2d, 0x20, 0x4e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x67,+ 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73,+ 0x65, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69,+ 0x73, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20,+ 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a, 0x69, 0x66, 0x20,+ 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x22,+ 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x32, 0x22, 0x20, 0x74, 0x68, 0x65,+ 0x6e, 0x20, 0x5f, 0x45, 0x4e, 0x56, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c,+ 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x61, 0x6e, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x50, 0x28, 0x31,+ 0x29, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x2d, 0x64,+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73,+ 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x6e, 0x6c, 0x20, 0x3d, 0x20, 0x6d,+ 0x2e, 0x50, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x7d, 0x0a, 0x0a, 0x0a, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x0a, 0x6c, 0x6f, 0x63,+ 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x65, 0x6d, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x67, 0x6d, 0x65, 0x6d, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63,+ 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,+ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,+ 0x20, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6d, 0x6d, 0x2e, 0x6c, 0x6f, 0x63,+ 0x61, 0x6c, 0x65, 0x28, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x29, 0x0a,+ 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x61, 0x20, 0x3d,+ 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x61, 0x6c, 0x70, 0x68,+ 0x61, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x63,+ 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x63, 0x6e,+ 0x74, 0x72, 0x6c, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66,+ 0x2e, 0x64, 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e,+ 0x64, 0x69, 0x67, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64,+ 0x65, 0x66, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x0a, 0x20, 0x20, 0x50, 0x72,+ 0x65, 0x64, 0x65, 0x66, 0x2e, 0x6c, 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65,+ 0x64, 0x65, 0x66, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x0a, 0x20, 0x20,+ 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x20, 0x3d, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x75, 0x6e, 0x63, 0x74, 0x0a,+ 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x73, 0x20, 0x3d,+ 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x73, 0x70, 0x61, 0x63,+ 0x65, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x75,+ 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x75, 0x70,+ 0x70, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66,+ 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e,+ 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64,+ 0x65, 0x66, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x2e, 0x78, 0x64, 0x69, 0x67, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x41, 0x20, 0x3d, 0x20, 0x61, 0x6e,+ 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x61,+ 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x43, 0x20,+ 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64,+ 0x65, 0x66, 0x2e, 0x63, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x2e, 0x44, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20,+ 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x64, 0x0a, 0x20, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x47, 0x20, 0x3d, 0x20, 0x61, 0x6e,+ 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x67,+ 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x4c, 0x20,+ 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64,+ 0x65, 0x66, 0x2e, 0x6c, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x2e, 0x50, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20,+ 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x0a, 0x20, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x53, 0x20, 0x3d, 0x20, 0x61, 0x6e,+ 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x73,+ 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x55, 0x20,+ 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64,+ 0x65, 0x66, 0x2e, 0x75, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65,+ 0x66, 0x2e, 0x57, 0x20, 0x3d, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20,+ 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x77, 0x0a, 0x20, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x58, 0x20, 0x3d, 0x20, 0x61, 0x6e,+ 0x79, 0x20, 0x2d, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x78,+ 0x0a, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20,+ 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72,+ 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,+ 0x6e, 0x0a, 0x20, 0x20, 0x66, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x7b,+ 0x7d, 0x0a, 0x20, 0x20, 0x67, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x7b,+ 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74,+ 0x20, 0x3d, 0x20, 0x7b, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d,+ 0x20, 0x22, 0x76, 0x22, 0x7d, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d,+ 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x6d, 0x65, 0x6d,+ 0x2c, 0x20, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d,+ 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x6d, 0x65,+ 0x6d, 0x2c, 0x20, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74,+ 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x67, 0x6d,+ 0x65, 0x6d, 0x2c, 0x20, 0x6d, 0x74, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a,+ 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x65, 0x28, 0x29, 0x0a, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x49, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x50, 0x28, 0x66, 0x75,+ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x2c, 0x69, 0x29,+ 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x69, 0x2c, 0x20, 0x73, 0x3a,+ 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x69, 0x2d, 0x31, 0x29, 0x29,+ 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x20, 0x65,+ 0x6e, 0x64, 0x29, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,+ 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x74,+ 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x73, 0x2c, 0x20,+ 0x69, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d,+ 0x73, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x23, 0x73, 0x20, 0x3c, 0x20, 0x69,+ 0x20, 0x2b, 0x20, 0x32, 0x30, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73,+ 0x3a, 0x73, 0x75, 0x62, 0x28, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x6f, 0x72, 0x20, 0x73, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x69, 0x2c,+ 0x69, 0x2b, 0x32, 0x30, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x2e,+ 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x28,+ 0x22, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72,+ 0x6f, 0x72, 0x20, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x27, 0x25, 0x73, 0x27,+ 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x73,+ 0x67, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d,+ 0x73, 0x67, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,+ 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x20, 0x28, 0x70, 0x2c, 0x20,+ 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e,+ 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x6d, 0x2e, 0x50, 0x28, 0x74, 0x72, 0x75,+ 0x65, 0x29, 0x0a, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6e,+ 0x20, 0x3e, 0x3d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x69, 0x66, 0x20, 0x6e, 0x25, 0x32, 0x20, 0x3e, 0x3d, 0x20, 0x31,+ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x70, 0x20, 0x3d, 0x20, 0x6e,+ 0x70, 0x20, 0x2a, 0x20, 0x70, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x20, 0x2a, 0x20, 0x70, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x2f, 0x32, 0x0a,+ 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x6e, 0x70, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,+ 0x6e, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x63, 0x61, 0x70, 0x20, 0x28,+ 0x73, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x69,+ 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x29, 0x20, 0x7e, 0x3d,+ 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68,+ 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69,+ 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x23, 0x63, 0x20, 0x2b, 0x20, 0x69,+ 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x3a, 0x73, 0x75, 0x62, 0x28,+ 0x69, 0x2c, 0x20, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d,+ 0x20, 0x63, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x65, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65,+ 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64,+ 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x53, 0x20, 0x3d, 0x20, 0x28, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66,+ 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2b, 0x20, 0x22, 0x2d, 0x2d,+ 0x22, 0x20, 0x2a, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x2d, 0x20, 0x50,+ 0x72, 0x65, 0x64, 0x65, 0x66, 0x2e, 0x6e, 0x6c, 0x29, 0x5e, 0x30, 0x29,+ 0x5e, 0x30, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61,+ 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x52, 0x28, 0x22, 0x41, 0x5a,+ 0x22, 0x2c, 0x20, 0x22, 0x61, 0x7a, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x5f,+ 0x22, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x52, 0x28, 0x22, 0x41, 0x5a,+ 0x22, 0x2c, 0x20, 0x22, 0x61, 0x7a, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x5f,+ 0x22, 0x2c, 0x20, 0x22, 0x30, 0x39, 0x22, 0x29, 0x5e, 0x30, 0x0a, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20,+ 0x3d, 0x20, 0x53, 0x20, 0x2a, 0x20, 0x22, 0x3c, 0x2d, 0x22, 0x0a, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x71, 0x5f, 0x66, 0x6f,+ 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x50, 0x22, 0x2f,+ 0x22, 0x20, 0x2b, 0x20, 0x22, 0x29, 0x22, 0x20, 0x2b, 0x20, 0x22, 0x7d,+ 0x22, 0x20, 0x2b, 0x20, 0x22, 0x3a, 0x7d, 0x22, 0x20, 0x2b, 0x20, 0x22,+ 0x7e, 0x7d, 0x22, 0x20, 0x2b, 0x20, 0x22, 0x7c, 0x7d, 0x22, 0x20, 0x2b,+ 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x61, 0x72, 0x72,+ 0x6f, 0x77, 0x29, 0x20, 0x2b, 0x20, 0x2d, 0x31, 0x0a, 0x0a, 0x6e, 0x61,+ 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x43, 0x28, 0x6e, 0x61, 0x6d,+ 0x65, 0x29, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x20, 0x64, 0x65,+ 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f,+ 0x6e, 0x6c, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d, 0x65, 0x61,+ 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69,+ 0x76, 0x65, 0x6e, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,+ 0x65, 0x6e, 0x74, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x44, 0x65,+ 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x6d,+ 0x2e, 0x43, 0x61, 0x72, 0x67, 0x28, 0x31, 0x29, 0x0a, 0x0a, 0x0a, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,+ 0x6e, 0x20, 0x67, 0x65, 0x74, 0x64, 0x65, 0x66, 0x20, 0x28, 0x69, 0x64,+ 0x2c, 0x20, 0x64, 0x65, 0x66, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f,+ 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x73,+ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x66, 0x73, 0x5b, 0x69, 0x64,+ 0x5d, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63,+ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28,+ 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x6e,+ 0x61, 0x6d, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x69, 0x64,+ 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x63, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d,+ 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d,+ 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,+ 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x20,+ 0x69, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f,+ 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69,+ 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x2d, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20,+ 0x27, 0x66, 0x27, 0x20, 0x28, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x66,+ 0x6f, 0x6c, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x27, 0x53, 0x75,+ 0x66, 0x66, 0x69, 0x78, 0x27, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65,+ 0x66, 0x77, 0x69, 0x74, 0x68, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x28, 0x66,+ 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d,+ 0x2e, 0x43, 0x67, 0x28, 0x44, 0x65, 0x66, 0x20, 0x2f, 0x20, 0x67, 0x65,+ 0x74, 0x64, 0x65, 0x66, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28,+ 0x66, 0x29, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f,+ 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x6d, 0x2e,+ 0x43, 0x28, 0x6d, 0x2e, 0x52, 0x22, 0x30, 0x39, 0x22, 0x5e, 0x31, 0x29,+ 0x20, 0x2a, 0x20, 0x53, 0x20, 0x2f, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d,+ 0x62, 0x65, 0x72, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53,+ 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x27, 0x22, 0x20,+ 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x28, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x2d,+ 0x20, 0x22, 0x27, 0x22, 0x29, 0x5e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x22,+ 0x27, 0x22, 0x20, 0x2b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x22, 0x27, 0x20,+ 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x28, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x2d,+ 0x20, 0x27, 0x22, 0x27, 0x29, 0x5e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x27,+ 0x22, 0x27, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64,+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x22, 0x25, 0x22,+ 0x20, 0x2a, 0x20, 0x44, 0x65, 0x66, 0x20, 0x2f, 0x20, 0x66, 0x75, 0x6e,+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x2c, 0x44, 0x65, 0x66,+ 0x73, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63,+ 0x61, 0x74, 0x20, 0x3d, 0x20, 0x20, 0x44, 0x65, 0x66, 0x73, 0x20, 0x61,+ 0x6e, 0x64, 0x20, 0x44, 0x65, 0x66, 0x73, 0x5b, 0x63, 0x5d, 0x20, 0x6f,+ 0x72, 0x20, 0x50, 0x72, 0x65, 0x64, 0x65, 0x66, 0x5b, 0x63, 0x5d, 0x0a,+ 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x74,+ 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20,+ 0x28, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e,+ 0x20, 0x63, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x20, 0x75, 0x6e, 0x64,+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x29, 0x20, 0x65, 0x6e, 0x64,+ 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x61,+ 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x43,+ 0x73, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x2a, 0x20, 0x28, 0x6d, 0x2e, 0x50,+ 0x22, 0x2d, 0x22, 0x2f, 0x22, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x61,+ 0x6e, 0x79, 0x20, 0x2d, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x29, 0x20, 0x2f,+ 0x20, 0x6d, 0x6d, 0x2e, 0x52, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x64, 0x65, 0x66,+ 0x69, 0x6e, 0x65, 0x64, 0x20, 0x2b, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65,+ 0x20, 0x2b, 0x20, 0x6d, 0x2e, 0x43, 0x28, 0x61, 0x6e, 0x79, 0x29, 0x29,+ 0x20, 0x2f, 0x20, 0x6d, 0x2e, 0x50, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x22, 0x5b, 0x22, 0x0a, 0x20, 0x20, 0x2a, 0x20, 0x28, 0x6d,+ 0x2e, 0x43, 0x28, 0x6d, 0x2e, 0x50, 0x22, 0x5e, 0x22, 0x5e, 0x2d, 0x31,+ 0x29, 0x29, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6f, 0x70, 0x74,+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,+ 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a,+ 0x20, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x66, 0x28, 0x69, 0x74, 0x65,+ 0x6d, 0x20, 0x2a, 0x20, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x2d, 0x20,+ 0x22, 0x5d, 0x22, 0x29, 0x5e, 0x30, 0x2c, 0x20, 0x6d, 0x74, 0x2e, 0x5f,+ 0x5f, 0x61, 0x64, 0x64, 0x29, 0x20, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75,+ 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x63, 0x2c, 0x20, 0x70,+ 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x20, 0x3d,+ 0x3d, 0x20, 0x22, 0x5e, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e,+ 0x79, 0x20, 0x2d, 0x20, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x20, 0x65,+ 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x2a, 0x20, 0x22, 0x5d, 0x22, 0x0a, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,+ 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x64, 0x65, 0x66, 0x20, 0x28, 0x74,+ 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x29, 0x0a, 0x20, 0x20,+ 0x69, 0x66, 0x20, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e,+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22,+ 0x27, 0x22, 0x2e, 0x2e, 0x6b, 0x2e, 0x2e, 0x22, 0x27, 0x20, 0x61, 0x6c,+ 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65,+ 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x22,+ 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x0a,+ 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f,+ 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,+ 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x64, 0x65, 0x66, 0x20, 0x28, 0x6e,+ 0x2c, 0x20, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,+ 0x61, 0x64, 0x64, 0x64, 0x65, 0x66, 0x28, 0x7b, 0x6e, 0x7d, 0x2c, 0x20,+ 0x6e, 0x2c, 0x20, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,+ 0x6f, 0x6e, 0x20, 0x4e, 0x54, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x62, 0x29,+ 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x20,+ 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72,+ 0x6f, 0x72, 0x28, 0x22, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x27, 0x22, 0x2e,+ 0x2e, 0x6e, 0x2e, 0x2e, 0x22, 0x27, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,+ 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x67, 0x72,+ 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c,+ 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6d,+ 0x2e, 0x56, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,+ 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20,+ 0x65, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x2e, 0x50, 0x7b, 0x20, 0x22,+ 0x45, 0x78, 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x45, 0x78, 0x70, 0x20,+ 0x3d, 0x20, 0x53, 0x20, 0x2a, 0x20, 0x28, 0x20, 0x6d, 0x2e, 0x56, 0x22,+ 0x47, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x6d,+ 0x2e, 0x43, 0x66, 0x28, 0x6d, 0x2e, 0x56, 0x22, 0x53, 0x65, 0x71, 0x22,+ 0x20, 0x2a, 0x20, 0x28, 0x22, 0x2f, 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20,+ 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x53, 0x65, 0x71, 0x22, 0x29, 0x5e,+ 0x30, 0x2c, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x61, 0x64, 0x64, 0x29,+ 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x53, 0x65, 0x71, 0x20, 0x3d, 0x20,+ 0x6d, 0x2e, 0x43, 0x66, 0x28, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x6d, 0x2e,+ 0x50, 0x22, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x50,+ 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x5e, 0x30, 0x20, 0x2c, 0x20, 0x6d,+ 0x74, 0x2e, 0x5f, 0x5f, 0x6d, 0x75, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x28, 0x23, 0x73, 0x65, 0x71,+ 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x2b, 0x20, 0x70, 0x61,+ 0x74, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3b, 0x0a, 0x20,+ 0x20, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x22, 0x26,+ 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22,+ 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x20, 0x2f, 0x20, 0x6d, 0x74,+ 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x22, 0x21, 0x22, 0x20, 0x2a, 0x20,+ 0x53, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x50, 0x72, 0x65, 0x66,+ 0x69, 0x78, 0x22, 0x20, 0x2f, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x75,+ 0x6e, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x2b, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78,+ 0x22, 0x3b, 0x0a, 0x20, 0x20, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x20,+ 0x3d, 0x20, 0x6d, 0x2e, 0x43, 0x66, 0x28, 0x6d, 0x2e, 0x56, 0x22, 0x50,+ 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20,+ 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x28, 0x20, 0x28, 0x20, 0x6d, 0x2e, 0x50, 0x22, 0x2b, 0x22, 0x20, 0x2a,+ 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x31, 0x2c, 0x20, 0x6d, 0x74, 0x2e,+ 0x5f, 0x5f, 0x70, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x6d, 0x2e, 0x50,+ 0x22, 0x2a, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x30,+ 0x2c, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x70, 0x6f, 0x77, 0x29, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x2b, 0x20, 0x6d, 0x2e, 0x50, 0x22, 0x3f, 0x22, 0x20, 0x2a, 0x20, 0x6d,+ 0x2e, 0x43, 0x63, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x6d, 0x74, 0x2e, 0x5f,+ 0x5f, 0x70, 0x6f, 0x77, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x22, 0x5e, 0x22, 0x20,+ 0x2a, 0x20, 0x28, 0x20, 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x6e, 0x75, 0x6d,+ 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x6d, 0x75, 0x6c, 0x74,+ 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b,+ 0x20, 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x6d, 0x2e, 0x43, 0x28, 0x6d, 0x2e,+ 0x53, 0x22, 0x2b, 0x2d, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x52, 0x22,+ 0x30, 0x39, 0x22, 0x5e, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43,+ 0x63, 0x28, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x70, 0x6f, 0x77, 0x29, 0x29,+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x0a, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b,+ 0x20, 0x22, 0x2d, 0x3e, 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20, 0x2a, 0x20,+ 0x28, 0x20, 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x28, 0x53, 0x74, 0x72, 0x69,+ 0x6e, 0x67, 0x20, 0x2b, 0x20, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x2a, 0x20,+ 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x64, 0x69,+ 0x76, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x6d, 0x2e, 0x50, 0x22, 0x7b,+ 0x7d, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x6e, 0x69,+ 0x6c, 0x2c, 0x20, 0x6d, 0x2e, 0x43, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20,+ 0x64, 0x65, 0x66, 0x77, 0x69, 0x74, 0x68, 0x66, 0x75, 0x6e, 0x63, 0x28,+ 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x64, 0x69, 0x76, 0x29, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29,+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x2b, 0x20, 0x22, 0x3d, 0x3e, 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20,+ 0x2a, 0x20, 0x64, 0x65, 0x66, 0x77, 0x69, 0x74, 0x68, 0x66, 0x75, 0x6e,+ 0x63, 0x28, 0x6d, 0x2e, 0x43, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x22,+ 0x7e, 0x3e, 0x22, 0x20, 0x2a, 0x20, 0x53, 0x20, 0x2a, 0x20, 0x64, 0x65,+ 0x66, 0x77, 0x69, 0x74, 0x68, 0x66, 0x75, 0x6e, 0x63, 0x28, 0x6d, 0x2e,+ 0x43, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x5e, 0x30, 0x2c,+ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x61,+ 0x2c, 0x62, 0x2c, 0x66, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e,+ 0x20, 0x66, 0x28, 0x61, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x20,+ 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,+ 0x20, 0x3d, 0x20, 0x22, 0x28, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x56,+ 0x22, 0x45, 0x78, 0x70, 0x22, 0x20, 0x2a, 0x20, 0x22, 0x29, 0x22, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x2b, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x20, 0x6d,+ 0x6d, 0x2e, 0x50, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x2b, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20,+ 0x22, 0x7b, 0x3a, 0x22, 0x20, 0x2a, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65,+ 0x20, 0x2a, 0x20, 0x22, 0x3a, 0x22, 0x20, 0x2b, 0x20, 0x6d, 0x2e, 0x43,+ 0x63, 0x28, 0x6e, 0x69, 0x6c, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x2e,+ 0x56, 0x22, 0x45, 0x78, 0x70, 0x22, 0x20, 0x2a, 0x20, 0x22, 0x3a, 0x7d,+ 0x22, 0x20, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e,+ 0x2c, 0x20, 0x70, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,+ 0x6d, 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x70, 0x2c, 0x20, 0x6e, 0x29, 0x20,+ 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x22, 0x3d, 0x22, 0x20, 0x2a, 0x20,+ 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,+ 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x6d, 0x6d, 0x2e, 0x43, 0x6d, 0x74, 0x28, 0x6d, 0x6d,+ 0x2e, 0x43, 0x62, 0x28, 0x6e, 0x29, 0x2c, 0x20, 0x65, 0x71, 0x75, 0x61,+ 0x6c, 0x63, 0x61, 0x70, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20,+ 0x6d, 0x2e, 0x50, 0x22, 0x7b, 0x7d, 0x22, 0x20, 0x2f, 0x20, 0x6d, 0x6d,+ 0x2e, 0x43, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x22, 0x7b, 0x7e, 0x22, 0x20, 0x2a,+ 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x45, 0x78, 0x70, 0x22, 0x20, 0x2a, 0x20,+ 0x22, 0x7e, 0x7d, 0x22, 0x20, 0x2f, 0x20, 0x6d, 0x6d, 0x2e, 0x43, 0x73,+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x2b, 0x20, 0x22, 0x7b, 0x7c, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e,+ 0x56, 0x22, 0x45, 0x78, 0x70, 0x22, 0x20, 0x2a, 0x20, 0x22, 0x7c, 0x7d,+ 0x22, 0x20, 0x2f, 0x20, 0x6d, 0x6d, 0x2e, 0x43, 0x74, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20,+ 0x22, 0x7b, 0x22, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x45, 0x78,+ 0x70, 0x22, 0x20, 0x2a, 0x20, 0x22, 0x7d, 0x22, 0x20, 0x2f, 0x20, 0x6d,+ 0x6d, 0x2e, 0x43, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x2b, 0x20, 0x6d, 0x2e, 0x50, 0x22, 0x2e, 0x22,+ 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x61, 0x6e, 0x79, 0x29,+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x2b, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x2d,+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20, 0x2b, 0x20, 0x22, 0x3c, 0x22, 0x20,+ 0x2a, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x22, 0x3e, 0x22,+ 0x29, 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x62, 0x28, 0x22, 0x47, 0x22,+ 0x29, 0x20, 0x2f, 0x20, 0x4e, 0x54, 0x3b, 0x0a, 0x20, 0x20, 0x44, 0x65,+ 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6e,+ 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20,+ 0x2a, 0x20, 0x6d, 0x2e, 0x56, 0x22, 0x45, 0x78, 0x70, 0x22, 0x3b, 0x0a,+ 0x20, 0x20, 0x47, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x3d, 0x20,+ 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x6d, 0x2e, 0x43, 0x63, 0x28, 0x74, 0x72,+ 0x75, 0x65, 0x29, 0x2c, 0x20, 0x22, 0x47, 0x22, 0x29, 0x20, 0x2a, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x6d, 0x2e, 0x43, 0x66, 0x28, 0x6d, 0x2e, 0x56, 0x22, 0x44, 0x65, 0x66,+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x2f, 0x20, 0x66,+ 0x69, 0x72, 0x73, 0x74, 0x64, 0x65, 0x66, 0x20, 0x2a, 0x20, 0x6d, 0x2e,+ 0x43, 0x67, 0x28, 0x6d, 0x2e, 0x56, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e,+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x5e, 0x30, 0x2c, 0x0a, 0x20,+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,+ 0x20, 0x61, 0x64, 0x64, 0x64, 0x65, 0x66, 0x29, 0x20, 0x2f, 0x20, 0x6d,+ 0x6d, 0x2e, 0x50, 0x0a, 0x7d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c,+ 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x53,+ 0x20, 0x2a, 0x20, 0x6d, 0x2e, 0x43, 0x67, 0x28, 0x6d, 0x2e, 0x43, 0x63,+ 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x2c, 0x20, 0x22, 0x47, 0x22,+ 0x29, 0x20, 0x2a, 0x20, 0x65, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x6d,+ 0x2e, 0x50, 0x20, 0x2a, 0x20, 0x28, 0x2d, 0x61, 0x6e, 0x79, 0x20, 0x2b,+ 0x20, 0x70, 0x61, 0x74, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29,+ 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e,+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c,+ 0x65, 0x20, 0x28, 0x70, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x73, 0x29, 0x0a,+ 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x6d, 0x2e, 0x74, 0x79, 0x70, 0x65,+ 0x28, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x70, 0x61, 0x74, 0x74,+ 0x65, 0x72, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65,+ 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x20,+ 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20,+ 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x61,+ 0x74, 0x74, 0x65, 0x72, 0x6e, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28,+ 0x70, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x73, 0x29, 0x0a,+ 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x70, 0x20,+ 0x74, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22,+ 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x70, 0x61,+ 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x2c, 0x20, 0x33, 0x29, 0x20, 0x65,+ 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,+ 0x63, 0x70, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d,+ 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x73, 0x2c, 0x20, 0x70, 0x2c, 0x20,+ 0x69, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63,+ 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x0a, 0x20,+ 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x70, 0x20, 0x74,+ 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x3d,+ 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x70, 0x29, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x20, 0x3d,+ 0x20, 0x63, 0x70, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20,+ 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x70, 0x3a, 0x6d, 0x61,+ 0x74, 0x63, 0x68, 0x28, 0x73, 0x2c, 0x20, 0x69, 0x20, 0x6f, 0x72, 0x20,+ 0x31, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61,+ 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,+ 0x69, 0x6e, 0x64, 0x20, 0x28, 0x73, 0x2c, 0x20, 0x70, 0x2c, 0x20, 0x69,+ 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x70,+ 0x20, 0x3d, 0x20, 0x66, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x0a, 0x20,+ 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x70, 0x20, 0x74,+ 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x3d,+ 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x70, 0x29, 0x20,+ 0x2f, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x3d,+ 0x20, 0x6d, 0x6d, 0x2e, 0x50, 0x7b, 0x20, 0x6d, 0x6d, 0x2e, 0x43, 0x70,+ 0x28, 0x29, 0x20, 0x2a, 0x20, 0x63, 0x70, 0x20, 0x2a, 0x20, 0x6d, 0x6d,+ 0x2e, 0x43, 0x70, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x2a, 0x20,+ 0x6d, 0x6d, 0x2e, 0x56, 0x28, 0x31, 0x29, 0x20, 0x7d, 0x0a, 0x20, 0x20,+ 0x20, 0x20, 0x66, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x20, 0x3d, 0x20,+ 0x63, 0x70, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c,+ 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x2c, 0x20, 0x65, 0x20, 0x3d, 0x20,+ 0x63, 0x70, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x2c, 0x20,+ 0x69, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66,+ 0x20, 0x69, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x69, 0x2c, 0x20, 0x65, 0x20, 0x2d, 0x20, 0x31, 0x0a,+ 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,+ 0x6e, 0x20, 0x69, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e,+ 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e,+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x73, 0x75, 0x62, 0x20, 0x28,+ 0x73, 0x2c, 0x20, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x29, 0x0a, 0x20,+ 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x67,+ 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x7d,+ 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65,+ 0x20, 0x67, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x20, 0x69, 0x73, 0x20,+ 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65,+ 0x64, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65,+ 0x0a, 0x20, 0x20, 0x67, 0x6d, 0x65, 0x6d, 0x5b, 0x70, 0x5d, 0x20, 0x3d,+ 0x20, 0x67, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63,+ 0x70, 0x20, 0x3d, 0x20, 0x67, 0x5b, 0x72, 0x65, 0x70, 0x5d, 0x0a, 0x20,+ 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x70, 0x20, 0x74,+ 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x3d,+ 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x28, 0x70, 0x29, 0x0a,+ 0x20, 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x3d, 0x20, 0x6d, 0x6d, 0x2e,+ 0x43, 0x73, 0x28, 0x28, 0x63, 0x70, 0x20, 0x2f, 0x20, 0x72, 0x65, 0x70,+ 0x20, 0x2b, 0x20, 0x31, 0x29, 0x5e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20,+ 0x20, 0x67, 0x5b, 0x72, 0x65, 0x70, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x70,+ 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74,+ 0x75, 0x72, 0x6e, 0x20, 0x63, 0x70, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68,+ 0x28, 0x73, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d,+ 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x61,+ 0x6d, 0x65, 0x73, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65,+ 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69,+ 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65,+ 0x2c, 0x0a, 0x20, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20,+ 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x66, 0x69, 0x6e,+ 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20,+ 0x67, 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x67, 0x73, 0x75, 0x62, 0x2c,+ 0x0a, 0x20, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6c, 0x6f, 0x63,+ 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,+ 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x0a, 0x7d, 0x0a, 0x0a, 0x69,+ 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d,+ 0x20, 0x22, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x31, 0x22, 0x20, 0x74,+ 0x68, 0x65, 0x6e, 0x20, 0x5f, 0x47, 0x2e, 0x72, 0x65, 0x20, 0x3d, 0x20,+ 0x72, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x75,+ 0x72, 0x6e, 0x20, 0x72, 0x65, 0x0a+};+unsigned int cbits_lpeg_1_0_2_re_lua_len = 6450;
lpeg.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: lpeg-version: 1.0.0+version: 1.0.1 synopsis: LPeg – Parsing Expression Grammars For Lua description: This package contains the C sources of LPeg, as well as some tiny Haskell helper to load the package.@@ -17,6 +17,7 @@ category: Foreign build-type: Simple extra-source-files: cbits/lpeg-1.0.2/*.h+ , cbits/re.h , README.md , CHANGELOG.md tested-with: GHC == 8.0.2@@ -69,11 +70,13 @@ else hs-source-dirs: src include-dirs: cbits/lpeg-1.0.2+ , cbits c-sources: cbits/lpeg-1.0.2/lpvm.c , cbits/lpeg-1.0.2/lptree.c , cbits/lpeg-1.0.2/lpprint.c , cbits/lpeg-1.0.2/lpcode.c , cbits/lpeg-1.0.2/lpcap.c+ , cbits/re.c cc-options: -std=c99 -fPIC test-suite test-lpeg
src/Lua/LPeg.hs view
@@ -8,6 +8,7 @@ -} module Lua.LPeg ( luaopen_lpeg_ptr+ , luaopen_re_ptr , lpeg_searcher ) where @@ -21,9 +22,8 @@ foreign import ccall unsafe "lptree.c &luaopen_lpeg" luaopen_lpeg_ptr :: CFunction --- | Name under which the module is loaded.-moduleName :: String-moduleName = "lpeg"+foreign import ccall unsafe "&luaopen_re"+ luaopen_re_ptr :: CFunction -- | A package searcher to be used with @package.searchers@), just for -- the "lpeg" module. Returns @nil@ on most inputs, but pushes a@@ -37,6 +37,7 @@ else do cstrLen <- peek lenPtr pkg <- peekCStringLen (cstr, fromIntegral cstrLen)- if pkg /= moduleName- then lua_pushnil l- else lua_pushcclosure l luaopen_lpeg_ptr 0+ case pkg of+ "lpeg" -> lua_pushcclosure l luaopen_lpeg_ptr 0+ "re" -> lua_pushcclosure l luaopen_re_ptr 0+ _ -> lua_pushnil l
substitute/Lua/LPeg.hs view
@@ -8,6 +8,7 @@ -} module Lua.LPeg ( luaopen_lpeg_ptr+ , luaopen_re_ptr , lpeg_searcher ) where @@ -17,11 +18,16 @@ import Foreign.Marshal (alloca) import Lua --- | Pointer to the placeholder library loader. Trying to load the+-- | Pointer to the placeholder lpeg library loader. Trying to load the -- library will result in an error. foreign import ccall unsafe "placeholder.c &luaopen_lpeg" luaopen_lpeg_ptr :: CFunction +-- | Pointer to the placeholder re library loader. Trying to load the+-- library will result in an error.+foreign import ccall unsafe "placeholder.c &luaopen_re"+ luaopen_re_ptr :: CFunction+ -- | Placeholder package searcher to be used with @package.searchers@), -- just for the "lpeg" module. Returns @nil@ on most inputs, but pushes -- adds a message about the module being unavailable when called on the@@ -35,12 +41,9 @@ else do cstrLen <- peek lenPtr pkg <- peekCStringLen (cstr, fromIntegral cstrLen)- if pkg /= moduleName- then 1 <$ lua_pushnil l- else 1 <$ withCString msg (lua_pushstring l)+ case pkg of+ "lpeg" -> 1 <$ withCString msg (lua_pushstring l)+ "re" -> 1 <$ withCString msg (lua_pushstring l)+ _ -> 1 <$ lua_pushnil l where msg = "\n\tlpeg was configured to be excluded from the binary."---- | Name under which the module is loaded.-moduleName :: String-moduleName = "lpeg"
test/test-lpeg.hs view
@@ -10,7 +10,7 @@ -} module Main where -import Control.Monad (void, when)+import Control.Monad import Foreign.C import Foreign.Ptr (nullPtr) import Lua@@ -25,12 +25,18 @@ tests = testGroup "LPeg" $ -- tests to check the correct types to make sure placeholder and the real -- thing don't diverge.- [ testCase "can push loader" $ do+ [ testCase "can push lpeg loader" $ do l <- hsluaL_newstate lua_pushcclosure l luaopen_lpeg_ptr 0 assertEqual "loader should be a function" LUA_TFUNCTION =<< lua_type l (-1) lua_close l+ , testCase "can push re loader" $ do+ l <- hsluaL_newstate+ lua_pushcclosure l luaopen_re_ptr 0+ assertEqual "loader should be a function"+ LUA_TFUNCTION =<< lua_type l (-1)+ lua_close l , testCase "can push searcher" $ do l <- hsluaL_newstate hslua_pushhsfunction l lpeg_searcher@@ -39,7 +45,7 @@ lua_close l ] ++ #ifndef RELY_ON_SYSTEM_INSTALL- [ testCase "load library via CFunction" $ do+ [ testCase "load lpeg library via CFunction" $ do l <- hsluaL_newstate lua_pushcclosure l luaopen_lpeg_ptr 0 stts <- lua_pcall l 0 1 0@@ -52,21 +58,45 @@ LUA_TFUNCTION =<< lua_type l (-1) lua_close l - , testCase "load library manually" $ do+ , testCase "load libraries manually" $ do l <- hsluaL_newstate luaL_openlibs l++ -- unset searchers+ _ <- withCString "package" $ lua_getglobal l+ pushstring l "searchers"+ _ <- lua_gettable l (-2)+ forM_ [1..4] $ \i -> lua_pushnil l *> lua_rawseti l (-2) i+ lua_pop l 2++ -- ensure that lpeg cannot be found+ runScript l "assert(not pcall(function() require 'lpeg' end))"+ -- ensure that re cannot be found+ runScript l "assert(not pcall(function() require 're' end))"+ -- get table "_LOADED" from registry _ <- withCString loadedTableRegistryField $ lua_pushstring l lua_rawget l LUA_REGISTRYINDEX + -- load lpeg _ <- withCString "lpeg" $ lua_pushstring l -- key lua_pushcclosure l luaopen_lpeg_ptr 0 stts <- lua_pcall l 0 1 0- when (stts /= LUA_OK) $- fail =<< peekCString =<< lua_tolstring l (-1) nullPtr+ if stts == LUA_OK+ then lua_rawset l (-3)+ else fail =<< peekCString =<< lua_tolstring l (-1) nullPtr - runTestScript l+ -- load re+ _ <- withCString "re" $ lua_pushstring l -- key+ lua_pushcclosure l luaopen_re_ptr 0+ stts' <- lua_pcall l 0 1 0+ if stts' == LUA_OK+ then lua_rawset l (-3)+ else fail =<< peekCString =<< lua_tolstring l (-1) nullPtr + runScript l testScript+ runScript l "re = require 're'; assert(type(re.gsub) == 'function')"+ lua_close l , testCase "use lpeg_searcher as searcher" $ do@@ -82,29 +112,32 @@ lua_pushnil l *> lua_rawseti l (-2) 4 lua_pop l 2 - runTestScript l+ runScript l testScript+ runScript l "local re = require 're'\n" lua_close l ] where- runTestScript l = do- stts <- withCStringLen testScript $ \(s, slen) ->+ runScript l script = do+ stts <- withCStringLen script $ \(s, slen) -> withCString "test script" $ \n -> luaL_loadbuffer l s (fromIntegral slen) n when (stts /= LUA_OK) $ do fail =<< peekCString =<< lua_tolstring l (-1) nullPtr+ stts' <- lua_pcall l 0 0 0+ when (stts' /= LUA_OK) $ do+ fail =<< peekCString =<< lua_tolstring l (-1) nullPtr testScript :: String testScript = unlines- [ "local m = require'lpeg'"+ [ "local m = require 'lpeg'" , "assert(type(m.version()) == 'string')" , "assert(m.type(m.P'alo') == 'pattern')" , "assert(m.match('a' * m.P(true), 'a') == 2)"- , "print 'HI MOM'" ] #else- [ testCase "loading the placeholder library causes an error" $ do+ [ testCase "loading the lpeg placeholder library causes an error" $ do l <- hsluaL_newstate lua_pushcclosure l luaopen_lpeg_ptr 0 stts <- lua_pcall l 0 1 0@@ -112,6 +145,14 @@ when (stts /= LUA_ERRRUN) $ fail "library loading should have failed with LUA_ERRRUN" + , testCase "loading the re placeholder library causes an error" $ do+ l <- hsluaL_newstate+ lua_pushcclosure l luaopen_re_ptr 0+ stts <- lua_pcall l 0 1 0+ stts `seq` lua_close l+ when (stts /= LUA_ERRRUN) $+ fail "library loading should have failed with LUA_ERRRUN"+ , testCase "searcher returns message" $ do l <- hsluaL_newstate luaL_openlibs l@@ -126,17 +167,20 @@ lua_pushnil l *> lua_rawseti l (-2) 4 lua_pop l 2 -- tables 'package' and 'searchers' - stts <- withCStringLen "require 'lpeg'" $ \(s, slen) ->- withCString "test script" $ \n ->- luaL_loadbuffer l s (fromIntegral slen) n- when (stts /= LUA_OK) $ do- fail =<< peekCString =<< lua_tolstring l (-1) nullPtr- callStatus <- lua_pcall l 0 0 0- case callStatus of- LUA_OK -> fail "require should have failed"- LUA_ERRRUN -> return ()- _ -> fail =<< peekCString =<< lua_tolstring l (-1) nullPtr+ let ensureRequireFails lib = do+ stts <- withCStringLen ("require '" ++ lib ++ "'") $ \(s, slen) ->+ withCString "test script" $+ luaL_loadbuffer l s (fromIntegral slen)+ when (stts /= LUA_OK) $ do+ fail =<< peekCString =<< lua_tolstring l (-1) nullPtr+ callStatus <- lua_pcall l 0 0 0+ case callStatus of+ LUA_OK -> fail "require should have failed"+ LUA_ERRRUN -> return ()+ _ -> fail =<< peekCString =<< lua_tolstring l (-1) nullPtr + ensureRequireFails "lpeg"+ ensureRequireFails "re" lua_close l ] #endif