[{"data":1,"prerenderedAt":706},["ShallowReactive",2],{"wiki-nav":3,"wiki-\u002Fwiki\u002Fdevelopers\u002Fcontributing":238,"wiki-surround-\u002Fwiki\u002Fdevelopers\u002Fcontributing":635,"wiki-meta:\u002Fwiki\u002Fdevelopers\u002Fcontributing":638,"wiki-sidebar":640},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Wiki","i-lucide-book","\u002Fwiki","wiki",[10,13,40,84,88,110,114,155,159,197,212,234],{"title":11,"path":7,"stem":12},"Wiki home","wiki\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":39},"About","i-lucide-info","\u002Fwiki\u002Fabout","wiki\u002Fabout",[19,23,27,31,35],{"title":20,"path":21,"stem":22},"Credits","\u002Fwiki\u002Fabout\u002Fcredits","wiki\u002Fabout\u002Fcredits",{"title":24,"path":25,"stem":26},"External connections","\u002Fwiki\u002Fabout\u002Fexternal-connections","wiki\u002Fabout\u002Fexternal-connections",{"title":28,"path":29,"stem":30},"Locale and translations","\u002Fwiki\u002Fabout\u002Flocale","wiki\u002Fabout\u002Flocale",{"title":32,"path":33,"stem":34},"Placeholders","\u002Fwiki\u002Fabout\u002Fplaceholders","wiki\u002Fabout\u002Fplaceholders",{"title":36,"path":37,"stem":38},"Why LuckPerms?","\u002Fwiki\u002Fabout\u002Fwhy-luckperms","wiki\u002Fabout\u002Fwhy-luckperms",false,{"title":41,"icon":42,"path":43,"stem":44,"children":45},"Commands","i-lucide-terminal","\u002Fwiki\u002Fcommands","wiki\u002Fcommands\u002Findex",[46,48,52,56,60,64,68,72,76,80],{"title":47,"path":43,"stem":44},"Command usage",{"title":49,"path":50,"stem":51},"General commands","\u002Fwiki\u002Fcommands\u002Fgeneral","wiki\u002Fcommands\u002Fgeneral",{"title":53,"path":54,"stem":55},"Group commands","\u002Fwiki\u002Fcommands\u002Fgroup","wiki\u002Fcommands\u002Fgroup",{"title":57,"path":58,"stem":59},"Log commands","\u002Fwiki\u002Fcommands\u002Flog","wiki\u002Fcommands\u002Flog",{"title":61,"path":62,"stem":63},"Meta commands","\u002Fwiki\u002Fcommands\u002Fmeta","wiki\u002Fcommands\u002Fmeta",{"title":65,"path":66,"stem":67},"Parent commands","\u002Fwiki\u002Fcommands\u002Fparent","wiki\u002Fcommands\u002Fparent",{"title":69,"path":70,"stem":71},"Permission commands","\u002Fwiki\u002Fcommands\u002Fpermission","wiki\u002Fcommands\u002Fpermission",{"title":73,"path":74,"stem":75},"Permissions reference","\u002Fwiki\u002Fcommands\u002Fpermissions","wiki\u002Fcommands\u002Fpermissions",{"title":77,"path":78,"stem":79},"Track commands","\u002Fwiki\u002Fcommands\u002Ftrack","wiki\u002Fcommands\u002Ftrack",{"title":81,"path":82,"stem":83},"User commands","\u002Fwiki\u002Fcommands\u002Fuser","wiki\u002Fcommands\u002Fuser",{"title":85,"path":86,"stem":87},"Configuration","\u002Fwiki\u002Fconfiguration","wiki\u002Fconfiguration",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":39},"Developers","i-lucide-code","\u002Fwiki\u002Fdevelopers","wiki\u002Fdevelopers",[94,98,102,106],{"title":95,"path":96,"stem":97},"Developer API","\u002Fwiki\u002Fdevelopers\u002Fapi","wiki\u002Fdevelopers\u002Fapi",{"title":99,"path":100,"stem":101},"API usage","\u002Fwiki\u002Fdevelopers\u002Fapi-usage","wiki\u002Fdevelopers\u002Fapi-usage",{"title":103,"path":104,"stem":105},"Contributing","\u002Fwiki\u002Fdevelopers\u002Fcontributing","wiki\u002Fdevelopers\u002Fcontributing",{"title":107,"path":108,"stem":109},"Standalone app and REST API","\u002Fwiki\u002Fdevelopers\u002Fstandalone-rest","wiki\u002Fdevelopers\u002Fstandalone-rest",{"title":111,"path":112,"stem":113},"FAQ","\u002Fwiki\u002Ffaq","wiki\u002Ffaq",{"title":115,"icon":116,"path":117,"stem":118,"children":119,"page":39},"Features","i-lucide-sparkles","\u002Fwiki\u002Ffeatures","wiki\u002Ffeatures",[120,124,128,132,136,140,151],{"title":121,"path":122,"stem":123},"Context","\u002Fwiki\u002Ffeatures\u002Fcontext","wiki\u002Ffeatures\u002Fcontext",{"title":125,"path":126,"stem":127},"Default groups","\u002Fwiki\u002Ffeatures\u002Fdefault-groups","wiki\u002Ffeatures\u002Fdefault-groups",{"title":129,"path":130,"stem":131},"Prefixes, suffixes and meta","\u002Fwiki\u002Ffeatures\u002Fprefixes-suffixes-meta","wiki\u002Ffeatures\u002Fprefixes-suffixes-meta",{"title":133,"path":134,"stem":135},"Tracks","\u002Fwiki\u002Ffeatures\u002Ftracks","wiki\u002Ffeatures\u002Ftracks",{"title":137,"path":138,"stem":139},"Verbose","\u002Fwiki\u002Ffeatures\u002Fverbose","wiki\u002Ffeatures\u002Fverbose",{"title":141,"path":142,"stem":143,"children":144},"Web Editor","\u002Fwiki\u002Ffeatures\u002Fweb-editor","wiki\u002Ffeatures\u002Fweb-editor\u002Findex",[145,147],{"title":146,"path":142,"stem":143},"Web editor",{"title":148,"path":149,"stem":150},"Web editor technical details","\u002Fwiki\u002Ffeatures\u002Fweb-editor\u002Ftechnical","wiki\u002Ffeatures\u002Fweb-editor\u002Ftechnical",{"title":152,"path":153,"stem":154},"Weight","\u002Fwiki\u002Ffeatures\u002Fweight","wiki\u002Ffeatures\u002Fweight",{"title":156,"path":157,"stem":158},"Getting started","\u002Fwiki\u002Fgetting-started","wiki\u002Fgetting-started",{"title":160,"icon":161,"path":162,"stem":163,"children":164,"page":39},"Guides","i-lucide-map","\u002Fwiki\u002Fguides","wiki\u002Fguides",[165,169,173,177,181,185,189,193],{"title":166,"path":167,"stem":168},"Argument-based command permissions","\u002Fwiki\u002Fguides\u002Fargument-permissions","wiki\u002Fguides\u002Fargument-permissions",{"title":170,"path":171,"stem":172},"Bulk editing","\u002Fwiki\u002Fguides\u002Fbulk-editing","wiki\u002Fguides\u002Fbulk-editing",{"title":174,"path":175,"stem":176},"Extensions","\u002Fwiki\u002Fguides\u002Fextensions","wiki\u002Fguides\u002Fextensions",{"title":178,"path":179,"stem":180},"Migration","\u002Fwiki\u002Fguides\u002Fmigration","wiki\u002Fguides\u002Fmigration",{"title":182,"path":183,"stem":184},"Prefix and suffix stacking","\u002Fwiki\u002Fguides\u002Fprefix-stacking","wiki\u002Fguides\u002Fprefix-stacking",{"title":186,"path":187,"stem":188},"Storage system errors","\u002Fwiki\u002Fguides\u002Fstorage-errors","wiki\u002Fguides\u002Fstorage-errors",{"title":190,"path":191,"stem":192},"Switching storage types","\u002Fwiki\u002Fguides\u002Fswitching-storage","wiki\u002Fguides\u002Fswitching-storage",{"title":194,"path":195,"stem":196},"Syncing data between servers","\u002Fwiki\u002Fguides\u002Fsyncing","wiki\u002Fguides\u002Fsyncing",{"title":198,"icon":199,"path":200,"stem":201,"children":202},"Installation","i-lucide-download","\u002Fwiki\u002Finstall","wiki\u002Finstall\u002Findex",[203,204,208],{"title":198,"path":200,"stem":201},{"title":205,"path":206,"stem":207},"Hytale","\u002Fwiki\u002Finstall\u002Fhytale","wiki\u002Finstall\u002Fhytale",{"title":209,"path":210,"stem":211},"Network installation","\u002Fwiki\u002Finstall\u002Fnetwork","wiki\u002Finstall\u002Fnetwork",{"title":213,"icon":214,"path":215,"stem":216,"children":217,"page":39},"Reference","i-lucide-library","\u002Fwiki\u002Freference","wiki\u002Freference",[218,222,226,230],{"title":219,"path":220,"stem":221},"Migrating from GroupManager or PermissionsEx","\u002Fwiki\u002Freference\u002Fmigrating-gm-pex","wiki\u002Freference\u002Fmigrating-gm-pex",{"title":223,"path":224,"stem":225},"How permission calculation works","\u002Fwiki\u002Freference\u002Fpermission-calculation","wiki\u002Freference\u002Fpermission-calculation",{"title":227,"path":228,"stem":229},"Self-hosting the web interfaces","\u002Fwiki\u002Freference\u002Fself-hosting","wiki\u002Freference\u002Fself-hosting",{"title":231,"path":232,"stem":233},"Upgrading from v4 to v5","\u002Fwiki\u002Freference\u002Fupgrade-v4-v5","wiki\u002Freference\u002Fupgrade-v4-v5",{"title":235,"path":236,"stem":237},"Storage types","\u002Fwiki\u002Fstorage","wiki\u002Fstorage",{"id":239,"title":103,"body":240,"description":628,"extension":629,"meta":630,"navigation":631,"path":104,"seo":632,"stem":105,"updatedAt":633,"__hash__":634},"wiki_en\u002Fwiki\u002Fdevelopers\u002Fcontributing.md",{"type":241,"value":242,"toc":615},"minimark",[243,247,250,261,266,274,283,286,290,293,336,340,343,346,353,356,361,366,369,376,379,390,393,397,402,412,421,424,428,433,451,465,473,481,503,507,516,519,571,575,583,586,589,612],[244,245,246],"p",{},"Hello!",[244,248,249],{},"The purpose of this guide is to help developers get setup and working on the LuckPerms codebase.",[244,251,252,253,260],{},"As well as the information below, we also have a dedicated Discord channel for talking about LuckPerms development and pull requests. Feel free to ",[254,255,259],"a",{"href":256,"rel":257},"https:\u002F\u002Fdiscord.gg\u002Fluckperms",[258],"nofollow","join and select the #contributors channel",". Please ask if you get stuck, we are more than happy to help.",[262,263,265],"h2",{"id":264},"getting-started","Getting Started",[244,267,268,269,273],{},"LuckPerms uses ",[270,271,272],"strong",{},"Gradle"," to handle dependency management and building.",[244,275,276,277,282],{},"Check out the ",[254,278,281],{"href":279,"rel":280},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002FREADME.md",[258],"README.md"," file for more information about how you can clone the code to your machine.",[244,284,285],{},"We suggest using the IntelliJ IDEA Java IDE when developing LuckPerms. It has great support for Gradle and excellent auto-completion functionality. You should just be able to get IntelliJ to clone LuckPerms from the Git repository and then sit back and relax while it sets up the rest (hopefully!).",[262,287,289],{"id":288},"project-layout","Project Layout",[244,291,292],{},"The project is split up into a few separate modules.",[294,295,296,308,317,327],"ul",{},[297,298,299,302,303,307],"li",{},[270,300,301],{},"API"," (",[304,305,306],"code",{},"\u002Fapi",") - The public API used by other plugins wishing to integrate with and retrieve data from LuckPerms. This module (for the most part) does not contain any implementation itself, and is provided by the plugin.",[297,309,310,302,313,316],{},[270,311,312],{},"Common",[304,314,315],{},"\u002Fcommon",") - The common module contains abstract code which is shared by all LuckPerms implementations (plugins). The idea is to reduce the amount of duplicated logic across all the different supported platforms. The common module depends on API.",[297,318,319,322,323,326],{},[270,320,321],{},"Plugin"," (e.g. ",[304,324,325],{},"\u002Fbukkit",") - Each use the common module to implement a \"LuckPerms plugin\" for a specific server platform. Plugins depend on the common module.",[297,328,329,322,332,335],{},[270,330,331],{},"Plugin Loaders",[304,333,334],{},"\u002Fbukkit\u002Floader",") - An extra module that sits just before the actual plugin and acts as a loader bootstrap. The purpose of this is to implement jar-in-jar and dependency loading on platforms without native support for injecting dependency jars at runtime.",[262,337,339],{"id":338},"abstraction","Abstraction",[244,341,342],{},"LuckPerms has quite a lot of abstraction in place to reduce duplicated code and create a divide between separate logical components. This can be tricky to navigate if you're new to the codebase, but is really important for keeping things maintainable.",[244,344,345],{},"Below is a diagram which visualises this abstraction.",[244,347,348],{},[349,350],"img",{"alt":351,"src":352},"","..\u002Fimg\u002Fcontributing-1.png",[244,354,355],{},"I've used Bukkit as an example, but all other platforms have similar classes.",[357,358,360],"h3",{"id":359},"low-level-loader","Low-level Loader",[244,362,363],{},[304,364,365],{},"class BukkitLoaderPlugin extends JavaPlugin",[244,367,368],{},"The bootstrap loader plugin is responsible for loading LuckPerms on the platform and getting things started. It is fairly slim, and for the most part you don't need to worry about it.",[244,370,371,372,375],{},"However, it's worth noting because it's the actual entrypoint into the plugin (it's the class that ",[304,373,374],{},"extends JavaPlugin"," in Bukkit land).",[244,377,378],{},"Not every platform has a loader, it is only needed for platforms which don't allow plugins to control their own class loader. In this case, LuckPerms uses a \"jar-in-jar\" system in which a minimal loader plugin sets up a child classloader and bootstraps the main plugin within it.",[244,380,381,382,389],{},"For example, see the ",[254,383,386],{"href":384,"rel":385},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fbukkit\u002Floader\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fbukkit\u002Floader\u002FBukkitLoaderPlugin.java",[258],[304,387,388],{},"BukkitLoaderPlugin"," class.",[244,391,392],{},"All this class does is setup a special classloader, then delegate the onEnable\u002FonDisable\u002Fetc method calls to the bootstrap. Let's cover that next.",[357,394,396],{"id":395},"low-level-bootstrap","Low-level Bootstrap",[244,398,399],{},[304,400,401],{},"class LPBukkitBootstrap implements LuckPermsBootstrap",[244,403,404,411],{},[254,405,408],{"href":406,"rel":407},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fcommon\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fcommon\u002Fplugin\u002Fbootstrap\u002FLuckPermsBootstrap.java",[258],[304,409,410],{},"LuckPermsBootstrap"," is a low-level interface for integration with the server platform. It handles things like logging, scheduling, and provides information about low-level objects within the platform (online players and that sort of thing).",[244,413,381,414,389],{},[254,415,418],{"href":416,"rel":417},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fbukkit\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fbukkit\u002FLPBukkitBootstrap.java",[258],[304,419,420],{},"LPBukkitBootstrap",[244,422,423],{},"This class doesn't contain any logic, it just provides things for the LuckPerms plugin.",[357,425,427],{"id":426},"high-level-plugin","High-level Plugin",[244,429,430],{},[304,431,432],{},"class LPBukkitPlugin extends AbstractLuckPermsPlugin implements LuckPermsPlugin",[244,434,435,442,443,450],{},[254,436,439],{"href":437,"rel":438},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fcommon\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fcommon\u002Fplugin\u002FLuckPermsPlugin.java",[258],[304,440,441],{},"LuckPermsPlugin"," is the main interface in LuckPerms. An abstract implementation is provided by ",[254,444,447],{"href":445,"rel":446},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fcommon\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fcommon\u002Fplugin\u002FAbstractLuckPermsPlugin.java",[258],[304,448,449],{},"AbstractLuckPermsPlugin",", which is extended on each platform for platform-specific integrations.",[244,452,453,458,459,464],{},[254,454,456],{"href":437,"rel":455},[258],[304,457,441],{}," is just an interface. It mostly has lots of getter methods which define what the \"LuckPerms plugin\" is made up of. This interface is often passed around (injected as a constructor dependency) other classes in the project to allow different components to access each other. You can also get the ",[254,460,462],{"href":406,"rel":461},[258],[304,463,410],{}," from it if you need to access any of the lower-level components like the logger or scheduler.",[244,466,467,472],{},[254,468,470],{"href":445,"rel":469},[258],[304,471,449],{}," is the primary plugin class. It defines lots of the shared logic for LuckPerms plugins. For example, any of the LuckPerms plugins enable, they all need to perform similar steps like setting up storage and registering listeners and commands. It makes sense to abstract as much of this as possible to reduce duplication.",[244,474,475,480],{},[254,476,478],{"href":445,"rel":477},[258],[304,479,449],{}," provides the high-level logic for enabling\u002Fdisabling the plugin, but also has a number of protected abstract methods allowing plugin implementations to provide their own custom logic or classes for use by the plugin.",[244,482,483,484,491,492,495,496,499,500,502],{},"This abstract plugin class is then overridden once per platform, for example see the ",[254,485,488],{"href":486,"rel":487},"https:\u002F\u002Fgithub.com\u002FLuckPerms\u002FLuckPerms\u002Fblob\u002Fmaster\u002Fbukkit\u002Fsrc\u002Fmain\u002Fjava\u002Fme\u002Flucko\u002Fluckperms\u002Fbukkit\u002FLPBukkitPlugin.java",[258],[304,489,490],{},"LPBukkitPlugin"," class. The subclass defines custom behaviour and provides custom objects used by the plugin on a specific platform (e.g. ",[304,493,494],{},"BukkitContextManager"," is provided as an implementation of ",[304,497,498],{},"ContextManager"," by ",[304,501,490],{},").",[262,504,506],{"id":505},"the-rest-of-the-codebase","The rest of the codebase",[244,508,509,510,515],{},"As noted previously, ",[254,511,513],{"href":437,"rel":512},[258],[304,514,441],{}," is the \"root\" of the plugin, which then expands out into other packages and classes.",[244,517,518],{},"For example:",[294,520,521,527,533,539,545,551,557,563,568],{},[297,522,523,526],{},[304,524,525],{},"UserManager"," handles the in-memory storage of LuckPerms users",[297,528,529,532],{},[304,530,531],{},"GroupManager"," handles the in-memory storage of LuckPerms groups",[297,534,535,538],{},[304,536,537],{},"TrackManager"," handles the in-memory storage of LuckPerms tracks",[297,540,541,544],{},[304,542,543],{},"LuckPermsConfiguration"," handles the plugin config file",[297,546,547,550],{},[304,548,549],{},"Storage"," is the root interface for all actions which interact with the plugin storage providers",[297,552,553,556],{},[304,554,555],{},"CommandManager"," handles all LuckPerms commands and their invocations",[297,558,559,562],{},[304,560,561],{},"DependencyManager"," handles runtime dependency loading and resolution",[297,564,565,567],{},[304,566,498],{}," handles context lookup and caching for players",[297,569,570],{},".. and much more, but hopefully the names\u002FJavaDocs are sufficient to explain the purpose of each.",[262,572,574],{"id":573},"codestyle","Codestyle",[244,576,577,578,582],{},"A consistent and ",[579,580,581],"em",{},"reasonably"," enforced codestyle is really important for the readability of project source code and ensuring that it remains maintainable.",[244,584,585],{},"It could be argued that the odd slip-up doesn't matter, and that style nit-picks are just project maintainers being obsessive - that might even be true to an extent - but on the other hand, these things add up over time, and it is better in the long run to keep on top of things.",[244,587,588],{},"In general:",[590,591,592,602],"ol",{},[297,593,594,597,598,601],{},[270,595,596],{},"Copy the style existing code where possible",". This will ",[579,599,600],{},"always"," work, regardless of the project, and is easier than trying to follow a \"style guide\" anyway.",[297,603,604,607,608,611],{},[270,605,606],{},"Minimise whitespace changes",", and ",[270,609,610],{},"review your diff"," before submitting a pull request for review. Most IDEs also have indicators for changed\u002Fadded\u002Fremoved lines, and buttons to rollback changed lines if they're not needed.",[244,613,614],{},"We're happy to help clean up commits at the end, but it saves lots of time if you do it as you go!",{"title":351,"searchDepth":616,"depth":616,"links":617},3,[618,620,621,626,627],{"id":264,"depth":619,"text":265},2,{"id":288,"depth":619,"text":289},{"id":338,"depth":619,"text":339,"children":622},[623,624,625],{"id":359,"depth":616,"text":360},{"id":395,"depth":616,"text":396},{"id":426,"depth":616,"text":427},{"id":505,"depth":619,"text":506},{"id":573,"depth":619,"text":574},"How to contribute to LuckPerms.","md",{},true,{"title":103,"description":628},null,"t4Ol5R9r7NLiPpkmVXM8SDypanJdUkGkL3Hy_AngLiw",[636,637],{"title":99,"path":100,"stem":101,"children":-1},{"title":107,"path":108,"stem":109,"children":-1},{"editUrl":639},"https:\u002F\u002Fgithub.com\u002FTurbotailz\u002Fwiki\u002Fedit\u002Fv3-structure\u002Fen\u002Fdevelopers\u002Fcontributing.md",[641],{"title":5,"icon":6,"path":7,"stem":8,"children":642},[643,644,651,663,664,670,671,683,684,694,699,705],{"title":11,"path":7,"stem":12},{"title":14,"icon":15,"path":16,"stem":17,"children":645,"page":39},[646,647,648,649,650],{"title":20,"path":21,"stem":22},{"title":24,"path":25,"stem":26},{"title":28,"path":29,"stem":30},{"title":32,"path":33,"stem":34},{"title":36,"path":37,"stem":38},{"title":41,"icon":42,"path":43,"stem":44,"children":652},[653,654,655,656,657,658,659,660,661,662],{"title":47,"path":43,"stem":44},{"title":49,"path":50,"stem":51},{"title":53,"path":54,"stem":55},{"title":57,"path":58,"stem":59},{"title":61,"path":62,"stem":63},{"title":65,"path":66,"stem":67},{"title":69,"path":70,"stem":71},{"title":73,"path":74,"stem":75},{"title":77,"path":78,"stem":79},{"title":81,"path":82,"stem":83},{"title":85,"path":86,"stem":87},{"title":89,"icon":90,"path":91,"stem":92,"children":665,"page":39},[666,667,668,669],{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"icon":116,"path":117,"stem":118,"children":672,"page":39},[673,674,675,676,677,678,682],{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127},{"title":129,"path":130,"stem":131},{"title":133,"path":134,"stem":135},{"title":137,"path":138,"stem":139},{"title":141,"path":142,"stem":143,"children":679},[680,681],{"title":146,"path":142,"stem":143},{"title":148,"path":149,"stem":150},{"title":152,"path":153,"stem":154},{"title":156,"path":157,"stem":158},{"title":160,"icon":161,"path":162,"stem":163,"children":685,"page":39},[686,687,688,689,690,691,692,693],{"title":166,"path":167,"stem":168},{"title":170,"path":171,"stem":172},{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188},{"title":190,"path":191,"stem":192},{"title":194,"path":195,"stem":196},{"title":198,"icon":199,"path":200,"stem":201,"children":695},[696,697,698],{"title":198,"path":200,"stem":201},{"title":205,"path":206,"stem":207},{"title":209,"path":210,"stem":211},{"title":213,"icon":214,"path":215,"stem":216,"children":700,"page":39},[701,702,703,704],{"title":219,"path":220,"stem":221},{"title":223,"path":224,"stem":225},{"title":227,"path":228,"stem":229},{"title":231,"path":232,"stem":233},{"title":235,"path":236,"stem":237},1789086425140]