rink/recipes/picadillo.html' => 4295, 'food-and-drink/recipes/pimiento-cheese-patty-melt.html' => 4296, 'food-and-drink/recipes/pineapple-and-avocado-salad.html' => 4297, 'food-and-drink/recipes/pineapple-and-coconut-napoleons.html' => 4298, 'food-and-drink/recipes/pineapple-and-jalapeno-salsa.html' => 4299, 'food-and-drink/recipes/pineapple-green-smoothie.html' => 4300, 'food-and-drink/recipes/pineapple-upside-down-muffins.html' => 4301, 'food-and-drink/recipes/pineapple-coconut-sorbet.html' => 4302, 'food-and-drink/recipes/pineapple-mint-vinaigrette.html' => 4303, 'food-and-drink/recipes/pineapple-raspberry-parfaits.html' => 4304, 'food-and-drink/recipes/pineapple-teriyaki-chicken.html' => 4305, 'food-and-drink/recipes/pink-grapefruit-tarragon-sorbet.html' => 4306, 'food-and-drink/recipes/pink-salmon-cakes-with-coriander-pesto.html' => 4307, 'food-and-drink/recipes/pinto-bean-and-andouille-sausage-stew.html' => 4308, 'food-and-drink/recipes/pistachio-crusted-chicken-with-warm-barley-salad.html' => 4309, 'food-and-drink/recipes/plantain-soup-(sopa-de-platanos).html' => 4310, 'food-and-drink/recipes/plum-sorbet.html' => 4311, 'food-and-drink/recipes/poached-cod-and-green-beans-with-pesto.html' => 4312, 'food-and-drink/recipes/poached-salmon-with-fresh-herb-salad.html' => 4313, 'food-and-drink/recipes/poblano-and-skirt-steak-fajitas.html' => 4314, 'food-and-drink/recipes/pomegranate-berry-smoothie.html' => 4315, 'food-and-drink/recipes/pork-and-broccoli-thai-noodle-salad.html' => 4316, 'food-and-drink/recipes/pork-and-snap-pea-lo-mein.html' => 4317, 'food-and-drink/recipes/pork-chop-suey.html' => 4318, 'food-and-drink/recipes/pork-milanese-with-mashed-sweet-potato.html' => 4319, 'food-and-drink/recipes/pork,-white-bean-and-kale-soup.html' => 4320, 'food-and-drink/recipes/port-and-plum-sorbet.html' => 4321, 'food-and-drink/recipes/portobello-philly-cheese-steak-sandwich.html' => 4322, 'food-and-drink/recipes/portobello-and-beef-patty-melt.html' => 4323, 'food-and-drink/recipes/portuguese-kale-and-red-bean-soup.html' => 4324, 'food-and-drink/recipes/pot-of-beans.html' => 4325, 'food-and-drink/recipes/potato-soup.html' => 4326, 'food-and-drink/recipes/potato-leek-bisque.html' => 4327, 'food-and-drink/recipes/potato,-asparagus-and-mushroom-hash.html' => 4328, 'food-and-drink/recipes/potsticker-and-vegetable-stir-fry.html' => 4329, 'food-and-drink/recipes/prosciutto-wrapped-asparagus.html' => 4330, 'food-and-drink/recipes/prosciutto-wrapped-pineapple-bites.html' => 4331, 'food-and-drink/recipes/prosciutto-wrapped-shrimp-with-rocket-salad.html' => 4332, 'food-and-drink/recipes/prosciutto-wrapped-shrimp-with-rocket-salad-for-two.html' => 4333, 'food-and-drink/recipes/protein-power-snack.html' => 4334, 'food-and-drink/recipes/provencal-style-edamame-saute.html' => 4335, 'food-and-drink/recipes/puerto-rican-fish-stew-(bacalao).html' => 4336, 'food-and-drink/recipes/pumpkin-bread.html' => 4337, 'food-and-drink/recipes/pumpkin-cheesecake-swirl-brownies.html' => 4338, 'food-and-drink/recipes/pumpkin-coconut-tart.html' => 4339, 'food-and-drink/recipes/pumpkin-pancakes.html' => 4340, 'food-and-drink/recipes/pumpkin-pie-with-rum.html' => 4341, 'food-and-drink/recipes/pumpkin-tart-with-pecan-shortbread-crust.html' => 4342, 'food-and-drink/recipes/pureed-broccoli-soup.html' => 4343, 'food-and-drink/recipes/quick-corned-beef-and-cabbage.html' => 4344, 'food-and-drink/recipes/quick-beef-and-barley-soup.html' => 4345, 'food-and-drink/recipes/quick-beef-and-nappa-cabbage-pho.html' => 4346, 'food-and-drink/recipes/quick-beet-salad.html' => 4347, 'food-and-drink/recipes/quick-cassoulet.html' => 4348, 'food-and-drink/recipes/quick-chicken-parmesan.html' => 4349, 'food-and-drink/recipes/quick-chicken-tikka-masala.html' => 4350, 'food-and-drink/recipes/quick-chicken-tikka-masala-for-two.html' => 4351, 'food-and-drink/recipes/quick-coq-au-vin.html' => 4352, 'food-and-drink/recipes/quick-dilly-carrots.html' => 4353, 'food-and-drink/recipes/quick-fettuccine-alfredo.html' => 4354, 'food-and-drink/recipes/quick-french-onion-soup.html' => 4355, 'food-and-drink/recipes/quick-giardiniera.html' => 4356, 'food-and-drink/recipes/quick-guacamole.html' => 4357, 'food-and-drink/recipes/quick-lentil-salmon-salad.html' => 4358, 'food-and-drink/recipes/quick-mixed-berry-pancake-sauce.html' => 4359, 'food-and-drink/recipes/quick-pasta-bolognese.html' => 4360, 'food-and-drink/recipes/quick-pepperpot-soup.html' => 4361, 'food-and-drink/recipes/quick-pork-and-chile-stew.html' => 4362, 'food-and-drink/recipes/quick-risotto-with-shrimp,-corn-and-edamame.html' => 4363, 'food-and-drink/recipes/quick-thai-chicken-and-vegetable-curry.html' => 4364, 'food-and-drink/recipes/quinoa-and-smoked-tofu-salad.html' => 4365, 'food-and-drink/recipes/quinoa-chicken-enchilada-casserole.html' => 4366, 'food-and-drink/recipes/quinoa-mushroom-soup.html' => 4367, 'food-and-drink/recipes/quinoa-peanut-soup-(sopa-de-mani).html' => 4368, 'food-and-drink/recipes/quinoa-pilaf-with-seared-scallops.html' => 4369, 'food-and-drink/recipes/quinoa-salad-with-dried-apricots-and-baby-spinach.html' => 4370, 'food-and-drink/recipes/quinoa-salad-with-oranges,-beets-and-pomegranate.html' => 4371, 'food-and-drink/recipes/quinoa-stuffed-delicata-squash.html' => 4372, 'food-and-drink/recipes/radish,-celery-and-snap-pea-salad.html' => 4373, 'food-and-drink/recipes/radish,-herb-and-feta-salad-with-lemon-vinaigrette.html' => 4374, 'food-and-drink/recipes/radish,-watercress-and-rocket-salad-with-feta-vinaigrette.html' => 4375, 'food-and-drink/recipes/rag-alla-bolognese-(classic-bolognese-meat-sauce).html' => 4376, 'food-and-drink/recipes/rainbow-chopped-salad.html' => 4377, 'food-and-drink/recipes/rainbow-slaw-with-beet-greens.html' => 4378, 'food-and-drink/recipes/rainbow-veggie-spring-roll-bowl.html' => 4379, 'food-and-drink/recipes/ranch-dip-and-crunchy-vegetables.html' => 4380, 'food-and-drink/recipes/raspberry-limeade.html' => 4381, 'food-and-drink/recipes/raspberry-overnight-muesli.html' => 4382, 'food-and-drink/recipes/raspberry-rhubarb-bread.html' => 4383, 'food-and-drink/recipes/raspberry-yogurt-cereal-bowl.html' => 4384, 'food-and-drink/recipes/raspberry-almond-crumb-tart.html' => 4385, 'food-and-drink/recipes/raspberry-avocado-smoothie.html' => 4386, 'food-and-drink/recipes/raspberry-chocolate-chip-frozen-yogurt.html' => 4387, 'food-and-drink/recipes/raspberry-peach-mango-smoothie-bowl.html' => 4388, 'food-and-drink/recipes/raspberry-prosecco-pops.html' => 4389, 'food-and-drink/recipes/raspberry,-avocado-and-mango-salad.html' => 4390, 'food-and-drink/recipes/ratatouille-black-rice-and-farro-salad.html' => 4391, 'food-and-drink/recipes/ratatouille-with-white-beans-and-polenta.html' => 4392, 'food-and-drink/recipes/ravioli-and-vegetable-soup.html' => 4393, 'food-and-drink/recipes/ravioli-with-rocket-and-pecorino.html' => 4394, 'food-and-drink/recipes/raw-kale-salad-with-roasted-garlic-dressing.html' => 4395, 'food-and-drink/recipes/real-man-quiche.html' => 4396, 'food-and-drink/recipes/red-and-white-salad.html' => 4397, 'food-and-drink/recipes/red-cabbage-salad-with-blue-cheese-and-maple-glazed-walnuts.html' => 4398, 'food-and-drink/recipes/red-curry-with-vegetables.html' => 4399, 'food-and-drink/recipes/red-flannel-hash.html' => 4400, 'food-and-drink/recipes/red-grapefruit-salad-with-avocado-and-pistachios.html' => 4401, 'food-and-drink/recipes/red-pepper-and-goat-cheese-frittata.html' => 4402, 'food-and-drink/recipes/rhubarb-and-lamb-tagine.html' => 4403, 'food-and-drink/recipes/rhubarb-fruit-salad.html' => 4404, 'food-and-drink/recipes/rhubarb-raspberry-crumble.html' => 4405, 'food-and-drink/recipes/ribollita-soup.html' => 4406, 'food-and-drink/recipes/rice-and-lentil-salad.html' => 4407, 'food-and-drink/recipes/rice-noodle-and-edamame-salad.html' => 4408, 'food-and-drink/recipes/rice-noodles-with-butternut-squash-and-five-spice-shrimp.html' => 4409, 'food-and-drink/recipes/rice,-cheddar-and-spinach-pie.html' => 4410, 'food-and-drink/recipes/rich-chicken-stew.html' => 4411, 'food-and-drink/recipes/ricotta-and-yogurt-parfait.html' => 4412, 'food-and-drink/recipes/ricotta-gnocchi-with-spring-vegetables.html' => 4413, 'food-and-drink/recipes/risotto-with-edamame,-rocket-and-porcini.html' => 4414, 'food-and-drink/recipes/roast-chicken-and-pomegranate-farro-salad.html' => 4415, 'food-and-drink/recipes/roast-chicken-with-parmesan-herb-sauce.html' => 4416, 'food-and-drink/recipes/roast-pork,-asparagus-and-cherry-tomato-bowl.html' => 4417, 'food-and-drink/recipes/roast-salmon-with-chimichurri-sauce.html' => 4418, 'food-and-drink/recipes/roasted-apple-and-cheddar-salad.html' => 4419, 'food-and-drink/recipes/roasted-asparagus-with-parmesan-breadcrumbs.html' => 4420, 'food-and-drink/recipes/roasted-autumn-vegetables-and-chicken-sausage.html' => 4421, 'food-and-drink/recipes/roasted-beet-and-barley-salad.html' => 4422, 'food-and-drink/recipes/roasted-beet-crostini.html' => 4423, 'food-and-drink/recipes/roasted-broccolini-and-goat-cheese-tartines.html' => 4424, 'food-and-drink/recipes/roasted-brussels-sprouts.html' => 4425, 'food-and-drink/recipes/roasted-brussels-sprouts-with-smoky-aioli.html' => 4426, 'food-and-drink/recipes/roasted-carrots-with-garlic-confit-and-thyme.html' => 4427, 'food-and-drink/recipes/roasted-cauliflower-and-potato-curry-soup.html' => 4428, 'food-and-drink/recipes/roasted-chicken-and-vegetable-quinoa-salad.html' => 4429, 'food-and-drink/recipes/roasted-chicken-drumsticks-and-potatoes-with-mojo-sauce.html' => 4430, 'food-and-drink/recipes/roasted-chicken-thighs,-potatoes-and-spring-onions-with-herb-vinaigrette.html' => 4431, 'food-and-drink/recipes/roasted-corn,-black-bean-and-mango-salad.html' => 4432, 'food-and-drink/recipes/roasted-eggplant,-courgette-and-pork-bowls.html' => 4433, 'food-and-drink/recipes/roasted-fennel-and-farro-salad.html' => 4434, 'food-and-drink/recipes/roasted-garlic-potato-salad.html' => 4435, 'food-and-drink/recipes/roasted-gnocchi-and-brussels-sprouts-with-meyer-lemon-vinaigrette.html' => 4436, 'food-and-drink/recipes/roasted-halibut-with-tangerine-and-olive-tapenade.html' => 4437, 'food-and-drink/recipes/roasted-kalettes-with-pine-nuts-and-currants.html' => 4438, 'food-and-drink/recipes/roasted-mango-sorbet.html' => 4439, 'food-and-drink/recipes/roasted-new-potatoes-and-green-beans.html' => 4440, 'food-and-drink/recipes/roasted-parsnip-soup.html' => 4441, 'food-and-drink/recipes/roasted-pear-butternut-soup-with-crumbled-stilton.html' => 4442, 'food-and-drink/recipes/roasted-pumpkin-apple-soup.html' => 4443, 'food-and-drink/recipes/roasted-red-pepper-spread.html' => 4444, 'food-and-drink/recipes/roasted-rhubarb-salad.html' => 4445, 'food-and-drink/recipes/roasted-salmon-and-butternut-squash-salad.html' => 4446, 'food-and-drink/recipes/roasted-swordfish-and-broccoli-rabe-with-piccata-butter.html' => 4447, 'food-and-drink/recipes/roasted-three-chile-salsa.html' => 4448, 'food-and-drink/recipes/roasted-tofu-and-peanut-noodle-salad.html' => 4449, 'food-and-drink/recipes/roasted-tomato-bread-soup.html' => 4450, 'food-and-drink/recipes/roasted-turnips-with-citrus-miso-butter.html' => 4451, 'food-and-drink/recipes/roasted-vegetable-antipasto.html' => 4452, 'food-and-drink/recipes/roasted-vegetable-enchiladas.html' => 4453, 'food-and-drink/recipes/romaine-salad-with-chicken,-apricots-and-mint.html' => 4454, 'food-and-drink/recipes/romaine-salad-with-grapefruit-and-shrimp.html' => 4455, 'food-and-drink/recipes/romaine-salad-with-orange,-feta-and-beans.html' => 4456, 'food-and-drink/recipes/romaine-wedges-with-sardines-and-caramelized-onions.html' => 4457, 'food-and-drink/recipes/root-vegetable-stew-with-herbed-dumplings.html' => 4458, 'food-and-drink/recipes/rosemary-flatbread-with-yellow-split-pea-spread.html' => 4459, 'food-and-drink/recipes/rosemary-lentils-and-greens-on-toasted-bread.html' => 4460, 'food-and-drink/recipes/rosemary-garlic-marinated-vegetables.html' => 4461, 'food-and-drink/recipes/rosemary-infused-cucumber-lemonade.html' => 4462, 'food-and-drink/recipes/ruby-red-grapefruit-cocktail.html' => 4463, 'food-and-drink/recipes/ruffled-phyllo-tart-with-spring-fruit.html' => 4464, 'food-and-drink/recipes/russian-tortellini-soup.html' => 4465, 'food-and-drink/recipes/rustic-parsley-and-orzo-soup-with-walnuts.html' => 4466, 'food-and-drink/recipes/saag-tofu.html' => 4467, 'food-and-drink/recipes/salad-of-boston-lettuce-with-creamy-orange-shallot-dressing.html' => 4468, 'food-and-drink/recipes/salmon-and-asparagus-farro-bowl.html' => 4469, 'food-and-drink/recipes/salmon-and-avocado-poke-bowl.html' => 4470, 'food-and-drink/recipes/salmon-and-eggplant-curry.html' => 4471, 'food-and-drink/recipes/salmon-chowder.html' => 4472, 'food-and-drink/recipes/salmon-panzanella.html' => 4473, 'food-and-drink/recipes/salmon-pita-sandwich.html' => 4474, 'food-and-drink/recipes/salmon-salad-sandwich.html' => 4475, 'food-and-drink/recipes/salmon-with-toasted-israeli-couscous.html' => 4476, 'food-and-drink/recipes/salsa-ranchera.html' => 4477, 'food-and-drink/recipes/salsa-rojo.html' => 4478, 'food-and-drink/recipes/salt-and-vinegar-roasted-radishes.html' => 4479, 'food-and-drink/recipes/salty-chihuahua.html' => 4480, 'food-and-drink/recipes/saucy-coconut-chicken-stir-fry.html' => 4481, 'food-and-drink/recipes/saucy-vegetarian-meatballs.html' => 4482, 'food-and-drink/recipes/sauerkraut-and-sausage-casserole.html' => 4483, 'food-and-drink/recipes/sausage-gumbo.html' => 4484, 'food-and-drink/recipes/sausage-soup.html' => 4485, 'food-and-drink/recipes/sausage-and-quinoa-stuffed-courgette.html' => 4486, 'food-and-drink/recipes/sausage,-cabbage-and-root-vegetable-soup.html' => 4487, 'food-and-drink/recipes/sausage,-mushroom-and-spinach-lasagna.html' => 4488, 'food-and-drink/recipes/sauteed-cauliflower-and-grape-tomatoes.html' => 4489, 'food-and-drink/recipes/savory-breakfast-tarts-with-rye-crust.html' => 4490, 'food-and-drink/recipes/savory-carrot-and-tarragon-tart.html' => 4491, 'food-and-drink/recipes/savory-cauliflower-cake.html' => 4492, 'food-and-drink/recipes/savory-millet-cakes.html' => 4493, 'food-and-drink/recipes/savory-orange-roasted-tofu-and-asparagus.html' => 4494, 'food-and-drink/recipes/savory-pancakes-with-sausage,-cheddar-and-wild-rice.html' => 4495, 'food-and-drink/recipes/savory-summer-squash-muffins-(dhoodhi-handvo).html' => 4496, 'food-and-drink/recipes/scallion-dill-potato-salad.html' => 4497, 'food-and-drink/recipes/scrambled-egg-burritos-with-black-bean-salsa.html' => 4498, 'food-and-drink/recipes/scrambled-eggs-with-ramps-and-bacon.html' => 4499, 'food-and-drink/recipes/seafood-couscous-paella.html' => 4500, 'food-and-drink/recipes/seafood-gumbo.html' => 4501, 'food-and-drink/recipes/seafood-paella-with-spring-vegetables.html' => 4502, 'food-and-drink/recipes/seafood-salad-with-citrus-vinaigrette.html' => 4503, 'food-and-drink/recipes/seafood-stew.html' => 4504, 'food-and-drink/recipes/seared-arctic-char-with-bacon-leek-chard.html' => 4505, 'food-and-drink/recipes/seared-salmon-with-sugar-snap-fennel-slaw.html' => 4506, 'food-and-drink/recipes/seared-salmon,-morels-and-fava-beans-with-green-goddess-sauce.html' => 4507, 'food-and-drink/recipes/seared-steak-salad-with-edamame-and-coriander.html' => 4508, 'food-and-drink/recipes/seared-strip-steaks-with-horseradish-root-vegetable-slaw.html' => 4509, 'food-and-drink/recipes/seaside-tomato-gazpacho.html' => 4510, 'food-and-drink/recipes/seeded-whole-grain-quick-bread.html' => 4511, 'food-and-drink/recipes/serbian-chicken-and-eggplant-soup.html' => 4512, 'food-and-drink/recipes/sesame-chicken-cucumber-noodle-salad.html' => 4513, 'food-and-drink/recipes/sesame-noodles-with-baked-tofu.html' => 4514, 'food-and-drink/recipes/sesame-ginger-marinated-vegetables.html' => 4515, 'food-and-drink/recipes/sesame-honey-carrot-ribbon-salad.html' => 4516, 'food-and-drink/recipes/sesame-honey-tempeh-and-quinoa-bowl.html' => 4517, 'food-and-drink/recipes/sesame-maple-roasted-tofu.html' => 4518, 'food-and-drink/recipes/seven-layer-salad.html' => 4519, 'food-and-drink/recipes/shamrock-shake-smoothie.html' => 4520, 'food-and-drink/recipes/shaved-brussels-sprouts-salad-with-lemon-chile-vinaigrette-and-toasted-hazelnuts.html' => 4521, 'food-and-drink/recipes/shaved-courgette-fennel-salad.html' => 4522, 'food-and-drink/recipes/shiitake-and-noodle-hot-and-sour-soup.html' => 4523, 'food-and-drink/recipes/shredded-root-vegetable-pancakes.html' => 4524, 'food-and-drink/recipes/shredded-turkey-and-pinto-bean-burritos.html' => 4525, 'food-and-drink/recipes/shrimp-and-cheddar-grits.html' => 4526, 'food-and-drink/recipes/shrimp-and-chinese-chive-wonton-soup.html' => 4527, 'food-and-drink/recipes/shrimp-and-pea-risotto.html' => 4528, 'food-and-drink/recipes/shrimp-and-pesto-pasta.html' => 4529, 'food-and-drink/recipes/shrimp-and-vegetable-red-rice-salad.html' => 4530, 'food-and-drink/recipes/shrimp-banh-mi.html' => 4531, 'food-and-drink/recipes/shrimp-caesar.html' => 4532, 'food-and-drink/recipes/shrimp-cakes-with-spicy-cajun-mayo.html' => 4533, 'food-and-drink/recipes/shrimp-cobb-salad.html' => 4534, 'food-and-drink/recipes/shrimp-dumplings.html' => 4535, 'food-and-drink/recipes/shrimp-fried-rice.html' => 4536, 'food-and-drink/recipes/shrimp-hand-rolls-with-coconut-curry-dipping-sauce.html' => 4537, 'food-and-drink/recipes/shrimp-pad-thai-salad.html' => 4538, 'food-and-drink/recipes/shrimp-panzanella.html' => 4539, 'food-and-drink/recipes/shrimp-piccata-with-courgette-noodles.html' => 4540, 'food-and-drink/recipes/shrimp-veracruzana.html' => 4541, 'food-and-drink/recipes/shrimp-with-broccoli.html' => 4542, 'food-and-drink/recipes/shrimp-with-mango-and-basil.html' => 4543, 'food-and-drink/recipes/shrimp,-asparagus-and-potatoes-with-spanish-romesco-sauce.html' => 4544, 'food-and-drink/recipes/sichuan-style-chicken-with-peanuts.html' => 4545, 'food-and-drink/recipes/sichuan-style-shrimp.html' => 4546, 'food-and-drink/recipes/sicilian-caponata.html' => 4547, 'food-and-drink/recipes/sicilian-pepper-salad.html' => 4548, 'food-and-drink/recipes/simple-green-salad-with-citronette.html' => 4549, 'food-and-drink/recipes/singapore-style-chicken-and-noodle-soup.html' => 4550, 'food-and-drink/recipes/skillet-gnocchi-with-shrimp-and-asparagus.html' => 4551, 'food-and-drink/recipes/skillet-strawberry-rhubarb-crisp.html' => 4552, 'food-and-drink/recipes/skillet-swiss-steak.html' => 4553, 'food-and-drink/recipes/skillet-tuna-noodle-casserole.html' => 4554, 'food-and-drink/recipes/skinny-guacamole.html' => 4555, 'food-and-drink/recipes/skinny-pineapple-margaritas.html' => 4556, 'food-and-drink/recipes/slow-cooked-beans.html' => 4557, 'food-and-drink/recipes/slow-cooker-black-bean-mushroom-chili.html' => 4558, 'food-and-drink/recipes/slow-cooker-braised-beef-with-carrots-and-turnips.html' => 4559, 'food-and-drink/recipes/slow-cooker-chicken-pho.html' => 4560, 'food-and-drink/recipes/slow-cooker-french-onion-soup.html' => 4561, 'food-and-drink/recipes/slow-cooker-moroccan-lentil-soup.html' => 4562, 'food-and-drink/recipes/slow-cooker-orange-scented-pot-roast-with-olives.html' => 4563, 'food-and-drink/recipes/slow-cooker-pinto-bean-stew-with-jalapeno-corn-dumplings.html' => 4564, 'food-and-drink/recipes/slow-cooker-quinoa-summer-squash-casserole.html' => 4565, 'food-and-drink/recipes/slow-cooker-shredded-beef-tacos-with-pico-de-gallo.html' => 4566, 'food-and-drink/recipes/slow-cooker-spanish-chickpea-soup.html' => 4567, 'food-and-drink/recipes/slow-cooker-stout-and-chicken-stew.html' => 4568, 'food-and-drink/recipes/slow-cooker-turkey-stroganoff.html' => 4569, 'food-and-drink/recipes/smoked-trout-and-spinach-scrambled-eggs.html' => 4570, 'food-and-drink/recipes/smoked-trout-salad.html' => 4571, 'food-and-drink/recipes/smoked-trout,-potato-and-rocket-salad.html' => 4572, 'food-and-drink/recipes/smoked-trout,-potato-and-rocket-salad-for-two.html' => 4573, 'food-and-drink/recipes/smoked-turkey-and-farro-salad.html' => 4574, 'food-and-drink/recipes/smoked-turkey,-kale-and-rice-bake.html' => 4575, 'food-and-drink/recipes/smoky-black-bean-soup.html' => 4576, 'food-and-drink/recipes/smoky-ham-and-corn-salad.html' => 4577, 'food-and-drink/recipes/smoky-shrimp,-corn-and-pea-one-pot-pasta.html' => 4578, 'food-and-drink/recipes/snap-pea-and-quinoa-salad.html' => 4579, 'food-and-drink/recipes/snap-pea-salad-with-radish-and-lime.html' => 4580, 'food-and-drink/recipes/snow-pea-and-carrot-salad-with-miso-tamari-dressing.html' => 4581, 'food-and-drink/recipes/snow-pea,-orange-and-jicama-salad.html' => 4582, 'food-and-drink/recipes/socca.html' => 4583, 'food-and-drink/recipes/sochi-salsa-(adjika).html' => 4584, 'food-and-drink/recipes/sofias-chicken-paprikash.html' => 4585, 'food-and-drink/recipes/soup-beans.html' => 4586, 'food-and-drink/recipes/south-pacific-shrimp.html' => 4587, 'food-and-drink/recipes/southeast-asian-inspired-salmon-soup.html' => 4588, 'food-and-drink/recipes/southwest-bean-soup.html' => 4589, 'food-and-drink/recipes/southwest-quinoa-cakes.html' => 4590, 'food-and-drink/recipes/southwestern-beef-and-bean-burger-wraps.html' => 4591, 'food-and-drink/recipes/southwestern-cheese-panini.html' => 4592, 'food-and-drink/recipes/southwestern-corn-and-black-bean-salad.html' => 4593, 'food-and-drink/recipes/southwestern-rice-and-pinto-bean-salad.html' => 4594, 'food-and-drink/recipes/southwestern-salmon-cobb-salad.html' => 4595, 'food-and-drink/recipes/southwestern-steak-salad.html' => 4596, 'food-and-drink/recipes/southwestern-three-bean-and-barley-soup.html' => 4597, 'food-and-drink/recipes/southwestern-tofu-scramble.html' => 4598, 'food-and-drink/recipes/southwestern-vegetable-and-chicken-soup.html' => 4599, 'food-and-drink/recipes/southwestern-vegetable-chowder.html' => 4600, 'food-and-drink/recipes/soy-lime-roasted-tofu.html' => 4601, 'food-and-drink/recipes/soy-marinated-flank-steak-with-soba-noodles.html' => 4602, 'food-and-drink/recipes/spaghetti-alla-carbonara.html' => 4603, 'food-and-drink/recipes/spaghetti-carbonara-with-peas.html' => 4604, 'food-and-drink/recipes/spaghetti-genovese.html' => 4605, 'food-and-drink/recipes/spaghetti-squash-and-meatballs.html' => 4606, 'food-and-drink/recipes/spaghetti-squash-and-pork-stir-fry.html' => 4607, 'food-and-drink/recipes/spaghetti-squash-lasagna-with-broccolini.html' => 4608, 'food-and-drink/recipes/spaghetti-squash-lo-mein.html' => 4609, 'food-and-drink/recipes/spaghetti-squash-with-roasted-tomatoes,-beans-and-almond-pesto.html' => 4610, 'food-and-drink/recipes/spaghetti-with-broccolini-pesto.html' => 4611, 'food-and-drink/recipes/spaghetti-with-quick-meat-sauce.html' => 4612, 'food-and-drink/recipes/spanakopita-loaded-potatoes.html' => 4613, 'food-and-drink/recipes/spanish-red-pepper-romesco-sauce.html' => 4614, 'food-and-drink/recipes/spanish-tortilla.html' => 4615, 'food-and-drink/recipes/spanish-inspired-tomato-salad.html' => 4616, 'food-and-drink/recipes/sparkling-cran-razzy.html' => 4617, 'food-and-drink/recipes/spiced-breakfast-quinoa.html' => 4618, 'food-and-drink/recipes/spiced-cauliflower-soup.html' => 4619, 'food-and-drink/recipes/spiced-creamy-wheat-with-cashews.html' => 4620, 'food-and-drink/recipes/spiced-eggplant-lentil-salad-with-mango.html' => 4621, 'food-and-drink/recipes/spiced-hot-chocolate.html' => 4622, 'food-and-drink/recipes/spiced-orange-compote.html' => 4623, 'food-and-drink/recipes/spiced-pumpkin-pie.html' => 4624, 'food-and-drink/recipes/spicy-beef-with-shrimp-and-bok-choy.html' => 4625, 'food-and-drink/recipes/spicy-butternut-squash-soup.html' => 4626, 'food-and-drink/recipes/spicy-green-salad-with-soy-and-roasted-garlic-dressing.html' => 4627, 'food-and-drink/recipes/spicy-jicama-and-red-onion-shoestrings-with-herbed-chipotle-aioli.html' => 4628, 'food-and-drink/recipes/spicy-meatloaf-with-collards.html' => 4629, 'food-and-drink/recipes/spicy-mediterranean-vinaigrette.html' => 4630, 'food-and-drink/recipes/spicy-ramen-cup-of-noodles.html' => 4631, 'food-and-drink/recipes/spicy-stewed-potatoes-and-spinach-with-buttermilk-(aloo-chaas).html' => 4632, 'food-and-drink/recipes/spicy-thai-shrimp-salad.html' => 4633, 'food-and-drink/recipes/spicy-tofu-hotpot.html' => 4634, 'food-and-drink/recipes/spicy-vegetable-soup.html' => 4635, 'food-and-drink/recipes/spinach-and-cheese-breakfast-skillet.html' => 4636, 'food-and-drink/recipes/spinach-and-goat-cheese-bisque.html' => 4637, 'food-and-drink/recipes/spinach-and-gruyere-stuffed-tilapia.html' => 4638, 'food-and-drink/recipes/spinach-and-sausage-gnocchi.html' => 4639, 'food-and-drink/recipes/spinach-and-sun-dried-tomato-stuffed-pizza.html' => 4640, 'food-and-drink/recipes/spinach-and-tuna-noodle-casserole.html' => 4641, 'food-and-drink/recipes/spinach-and-warm-mushroom-salad.html' => 4642, 'food-and-drink/recipes/spinach-salad-with-avocado-ranch-dressing.html' => 4643, 'food-and-drink/recipes/spinach-salad-with-beets,-beans-and-feta.html' => 4644, 'food-and-drink/recipes/spinach-salad-with-japanese-ginger-dressing.html' => 4645, 'food-and-drink/recipes/spinach-salad-with-steak-and-blueberries.html' => 4646, 'food-and-drink/recipes/spinach-soup-with-rosemary-croutons.html' => 4647, 'food-and-drink/recipes/spinach-with-chickpeas.html' => 4648, 'food-and-drink/recipes/spinach,-avocado-and-mango-salad.html' => 4649, 'food-and-drink/recipes/spring-chicken-and-barley-soup.html' => 4650, 'food-and-drink/recipes/spring-chicken-and-blue-cheese-salad.html' => 4651, 'food-and-drink/recipes/spring-green-salad-with-rouille-dressing.html' => 4652, 'food-and-drink/recipes/spring-pea-salad-with-strawberries.html' => 4653, 'food-and-drink/recipes/spring-pizza.html' => 4654, 'food-and-drink/recipes/spring-roll-salad.html' => 4655, 'food-and-drink/recipes/spring-salad-with-beets,-prosciutto-and-creamy-onion-dressing.html' => 4656, 'food-and-drink/recipes/spring-salad-with-peas-and-frizzled-shallots.html' => 4657, 'food-and-drink/recipes/squash-and-corn-chowder.html' => 4658, 'food-and-drink/recipes/squash-and-red-lentil-curry.html' => 4659, 'food-and-drink/recipes/squash-pie.html' => 4660, 'food-and-drink/recipes/squash,-black-bean-and-goat-cheese-tamales.html' => 4661, 'food-and-drink/recipes/squash,-chickpea-and-red-lentil-stew.html' => 4662, 'food-and-drink/recipes/sriracha-buffalo-cauliflower-bites.html' => 4663, 'food-and-drink/recipes/st.-louis-slinger.html' => 4664, 'food-and-drink/recipes/steak-and-potato-salad-with-horseradish-dressing.html' => 4665, 'food-and-drink/recipes/steak-and-purple-potato-salad.html' => 4666, 'food-and-drink/recipes/steak-bun.html' => 4667, 'food-and-drink/recipes/steak-salad-stuffed-pockets.html' => 4668, 'food-and-drink/recipes/stir-fried-chile-beef-and-broccoli.html' => 4669, 'food-and-drink/recipes/stir-fried-spicy-chicken-tenders.html' => 4670, 'food-and-drink/recipes/stovetop-fideos.html' => 4671, 'food-and-drink/recipes/strawberries-and-cream-parfaits.html' => 4672, 'food-and-drink/recipes/strawberry-and-cream-cheese-sandwich.html' => 4673, 'food-and-drink/recipes/strawberry-and-yogurt-parfait.html' => 4674, 'food-and-drink/recipes/strawberry-chile-martini.html' => 4675, 'food-and-drink/recipes/strawberry-coolers.html' => 4676, 'food-and-drink/recipes/strawberry-fool.html' => 4677, 'food-and-drink/recipes/strawberry-frozen-yogurt.html' => 4678, 'food-and-drink/recipes/strawberry-fruit-salad.html' => 4679, 'food-and-drink/recipes/strawberry-meringue-cake.html' => 4680, 'food-and-drink/recipes/strawberry-rhubarb-pie.html' => 4681, 'food-and-drink/recipes/strawberry-sherbet.html' => 4682, 'food-and-drink/recipes/strawberry-shortcake.html' => 4683, 'food-and-drink/recipes/strawberry-sorbet.html' => 4684, 'food-and-drink/recipes/strawberry-banana-green-smoothie.html' => 4685, 'food-and-drink/recipes/strawberry-banana-protein-smoothie.html' => 4686, 'food-and-drink/recipes/strawberry-banana-smoothie-pops.html' => 4687, 'food-and-drink/recipes/strawberry-black-pepper-tart-for-two.html' => 4688, 'food-and-drink/recipes/strawberry-chocolate-ice-cream.html' => 4689, 'food-and-drink/recipes/strawberry-coconut-daiquiri.html' => 4690, 'food-and-drink/recipes/strawberry-lime-ice-cream-pie.html' => 4691, 'food-and-drink/recipes/strawberry-orange-muffins.html' => 4692, 'food-and-drink/recipes/strawberry-peach-green-tea-smoothie.html' => 4693, 'food-and-drink/recipes/strawberry-rhubarb-filling.html' => 4694, 'food-and-drink/recipes/strawberry-rhubarb-fruit-bars.html' => 4695, 'food-and-drink/recipes/strawberry-rhubarb-quinoa-pudding.html' => 4696, 'food-and-drink/recipes/strawberry-rhubarb-squares.html' => 4697, 'food-and-drink/recipes/strawberry-rhubarb-strudel.html' => 4698, 'food-and-drink/recipes/strawberry-rhubarb-upside-down-cake.html' => 4699, 'food-and-drink/recipes/stuffed-chard-with-fresh-marinara.html' => 4700, 'food-and-drink/recipes/stuffed-delicata-squash.html' => 4701, 'food-and-drink/recipes/sugar-snap-pea-and-barley-salad.html' => 4702, 'food-and-drink/recipes/sugar-snap-pea-salad.html' => 4703, 'food-and-drink/recipes/sugar-snap-salad.html' => 4704, 'food-and-drink/recipes/sugar-free-strawberry-frozen-yogurt.html' => 4705, 'food-and-drink/recipes/summer-fruit-punch.html' => 4706, 'food-and-drink/recipes/summer-squash-and-white-bean-saute.html' => 4707, 'food-and-drink/recipes/summer-squash-pad-thai.html' => 4708, 'food-and-drink/recipes/summer-succotash-salad.html' => 4709, 'food-and-drink/recipes/summer-tomato,-onion-and-cucumber-salad.html' => 4710, 'food-and-drink/recipes/summer-vegetable-crepes.html' => 4711, 'food-and-drink/recipes/summer-vegetable-pasta-with-crispy-goat-cheese-medallions.html' => 4712, 'food-and-drink/recipes/sun-dried-tomato-tuna-panini.html' => 4713, 'food-and-drink/recipes/sunny-side-beans.html' => 4714, 'food-and-drink/recipes/sunrise-bellini.html' => 4715, 'food-and-drink/recipes/super-green-edamame-salad.html' => 4716, 'food-and-drink/recipes/swedish-yellow-split-pea-soup-with-ham.html' => 4717, 'food-and-drink/recipes/sweet-and-savory-beef-stew.html' => 4718, 'food-and-drink/recipes/sweet-and-sour-beef-cabbage-soup.html' => 4719, 'food-and-drink/recipes/sweet-and-sour-tofu.html' => 4720, 'food-and-drink/recipes/sweet-corn-ice-cream.html' => 4721, 'food-and-drink/recipes/sweet-corn-salad.html' => 4722, 'food-and-drink/recipes/sweet-potato-and-black-bean-chili-for-two.html' => 4723, 'food-and-drink/recipes/sweet-potato-and-cabbage-slaw.html' => 4724, 'food-and-drink/recipes/sweet-potato-and-red-pepper-pasta.html' => 4725, 'food-and-drink/recipes/sweet-potato-carbonara-with-spinach-and-mushrooms.html' => 4726, 'food-and-drink/recipes/sweet-potato-casserole.html' => 4727, 'food-and-drink/recipes/sweet-potato-chips.html' => 4728, 'food-and-drink/recipes/sweet-potato-fritters-with-smoky-pinto-beans.html' => 4729, 'food-and-drink/recipes/sweet-potato-hash-with-black-forest-ham.html' => 4730, 'food-and-drink/recipes/sweet-potato-mac-and-cheese.html' => 4731, 'food-and-drink/recipes/sweet-potato-pie-with-cream-cheese-swirl.html' => 4732, 'food-and-drink/recipes/sweet-potato-pudding-cake.html' => 4733, 'food-and-drink/recipes/sweet-potato-skins-with-guacamole.html' => 4734, 'food-and-drink/recipes/sweet-potato-tartlets-with-cardamom-saffron-yogurt.html' => 4735, 'food-and-drink/recipes/sweet-potato-turkey-hash.html' => 4736, 'food-and-drink/recipes/sweet-potato,-red-onion-and-fontina-tart.html' => 4737, 'food-and-drink/recipes/sweet-potatoes-with-warm-black-bean-salad.html' => 4738, 'food-and-drink/recipes/sweetened-ricotta-and-apricot-crepes.html' => 4739, 'food-and-drink/recipes/szechuan-tofu-and-green-bean-stir-fry.html' => 4740, 'food-and-drink/recipes/tabbouleh-with-chickpeas.html' => 4741, 'food-and-drink/recipes/tabbouleh-with-grilled-vegetables.html' => 4742, 'food-and-drink/recipes/tangelo-pork-stir-fry.html' => 4743, 'food-and-drink/recipes/tangerine-and-roasted-beet-salad-with-feta-and-pistachios.html' => 4744, 'food-and-drink/recipes/tangerine-bourbon-sidecars.html' => 4745, 'food-and-drink/recipes/tangerine-upside-down-cake.html' => 4746, 'food-and-drink/recipes/tangy-cauliflower-salad.html' => 4747, 'food-and-drink/recipes/tex-mex-chili-nachos.html' => 4748, 'food-and-drink/recipes/thai-bouillabaisse.html' => 4749, 'food-and-drink/recipes/thai-chicken-and-mango-stir-fry.html' => 4750, 'food-and-drink/recipes/thai-chicken-pizza.html' => 4751, 'food-and-drink/recipes/thai-chicken-salad.html' => 4752, 'food-and-drink/recipes/thai-coconut-curry-soup.html' => 4753, 'food-and-drink/recipes/thai-curry-and-pork-sesame-noodles.html' => 4754, 'food-and-drink/recipes/thai-peanut-curry-noodles.html' => 4755, 'food-and-drink/recipes/thai-red-curry-with-vegetables.html' => 4756, 'food-and-drink/recipes/thai-style-melon-and-beef-salad.html' => 4757, 'food-and-drink/recipes/the-eatingwell-taco.html' => 4758, 'food-and-drink/recipes/the-ghost-of-christmas-sparkling-wine-cocktail.html' => 4759, 'food-and-drink/recipes/three-bean-salad.html' => 4760, 'food-and-drink/recipes/three-herb-potato-salad.html' => 4761, 'food-and-drink/recipes/tijuana-torta.html' => 4762, 'food-and-drink/recipes/tilapia-corn-chowder.html' => 4763, 'food-and-drink/recipes/tilapia-with-grapefruit-caper-sauce.html' => 4764, 'food-and-drink/recipes/toasted-coconut-and-almond-ice-cream.html' => 4765, 'food-and-drink/recipes/toasted-pita-and-bean-salad.html' => 4766, 'food-and-drink/recipes/toasted-quinoa-salad-with-scallops-and-snow-peas.html' => 4767, 'food-and-drink/recipes/tofu-and-broccoli-stir-fry.html' => 4768, 'food-and-drink/recipes/tofu-and-vegetable-stew.html' => 4769, 'food-and-drink/recipes/tofu-parmigiana.html' => 4770, 'food-and-drink/recipes/tofu-ratatouille-kebabs.html' => 4771, 'food-and-drink/recipes/tofu-tropic-smoothie.html' => 4772, 'food-and-drink/recipes/tofu-with-peanut-ginger-sauce.html' => 4773, 'food-and-drink/recipes/tofu-with-thai-curry-sauce.html' => 4774, 'food-and-drink/recipes/tom-yum-soup-with-pineapple.html' => 4775, 'food-and-drink/recipes/tomatillo-breakfast-tacos.html' => 4776, 'food-and-drink/recipes/tomato-and-fennel-salad.html' => 4777, 'food-and-drink/recipes/tomato-salad-with-charred-red-onions-and-okra-fries.html' => 4778, 'food-and-drink/recipes/tomato-sandwiches-with-basil-anchovy-mayo.html' => 4779, 'food-and-drink/recipes/tomato-soup.html' => 4780, 'food-and-drink/recipes/tomato-jalapeno-bloody-mary.html' => 4781, 'food-and-drink/recipes/tomato-peach-cobbler.html' => 4782, 'food-and-drink/recipes/tomato-pesto-socca.html' => 4783, 'food-and-drink/recipes/tomato,-tuna-and-tarragon-salad.html' => 4784, 'food-and-drink/recipes/tomato,-watermelon-and-avocado-salad.html' => 4785, 'food-and-drink/recipes/tortellini-and-courgette-soup.html' => 4786, 'food-and-drink/recipes/tortellini-primavera.html' => 4787, 'food-and-drink/recipes/tortilla-soup.html' => 4788, 'food-and-drink/recipes/triple-celery-bisque.html' => 4789, 'food-and-drink/recipes/triple-melon-smoothie.html' => 4790, 'food-and-drink/recipes/tropical-cucumber-salad.html' => 4791, 'food-and-drink/recipes/tropical-fruit-and-nuts-snack.html' => 4792, 'food-and-drink/recipes/tropical-fruit-ice.html' => 4793, 'food-and-drink/recipes/tropical-fruits-with-pistachios-and-coconut.html' => 4794, 'food-and-drink/recipes/tropical-melon-smoothie.html' => 4795, 'food-and-drink/recipes/tuna-pasta-with-olives-and-artichokes.html' => 4796, 'food-and-drink/recipes/tuna-salad-stuffed-tomatoes-with-rocket.html' => 4797, 'food-and-drink/recipes/tuna-and-tomato-mac-and-cheese.html' => 4798, 'food-and-drink/recipes/turkey-and-squash-soup.html' => 4799, 'food-and-drink/recipes/turkey-and-vegetable-meatloaf.html' => 4800, 'food-and-drink/recipes/turkey-albondigas-soup.html' => 4801, 'food-and-drink/recipes/turkey-sausage-and-rocket-pasta.html' => 4802, 'food-and-drink/recipes/turkey-taco-lettuce-wrap.html' => 4803, 'food-and-drink/recipes/turkish-style-pizza.html' => 4804, 'food-and-drink/recipes/tuscan-kale-and-white-bean-bruschetta.html' => 4805, 'food-and-drink/recipes/tuscan-style-tuna-salad.html' => 4806, 'food-and-drink/recipes/tutti-frutti-muesli.html' => 4807, 'food-and-drink/recipes/two-pepper-shrimp-with-creamy-pecorino-oats.html' => 4808, 'food-and-drink/recipes/ultimate-beef-chili.html' => 4809, 'food-and-drink/recipes/unicorn-smoothie.html' => 4810, 'food-and-drink/recipes/upside-down-cake-with-poached-dried-fruits.html' => 4811, 'food-and-drink/recipes/vanilla-strawberries-with-lemon-ricotta.html' => 4812, 'food-and-drink/recipes/vanilla-orange-freezer-pops.html' => 4813, 'food-and-drink/recipes/vanilla-rosemary-double-potato-dauphinoise.html' => 4814, 'food-and-drink/recipes/vegan-cauliflower-egg-salad.html' => 4815, 'food-and-drink/recipes/vegan-fruit-smoothie.html' => 4816, 'food-and-drink/recipes/vegan-pancakes.html' => 4817, 'food-and-drink/recipes/vegan-pumpkin-pie.html' => 4818, 'food-and-drink/recipes/vegan-smoothie-bowl.html' => 4819, 'food-and-drink/recipes/vegan-sourdough-stuffing.html' => 4820, 'food-and-drink/recipes/vegetable-and-sausage-skillet-supper.html' => 4821, 'food-and-drink/recipes/vegetable-fried-rice.html' => 4822, 'food-and-drink/recipes/vegetable-satay.html' => 4823, 'food-and-drink/recipes/vegetarian-broccoli-cheese-pie.html' => 4824, 'food-and-drink/recipes/vegetarian-chili.html' => 4825, 'food-and-drink/recipes/vegetarian-hot-pot.html' => 4826, 'food-and-drink/recipes/vegetarian-pinto-bean-sloppy-joes.html' => 4827, 'food-and-drink/recipes/vegetarian-quinoa-and-squash-casserole.html' => 4828, 'food-and-drink/recipes/vegetarian-reubens-with-russian-dressing.html' => 4829, 'food-and-drink/recipes/vegetarian-shepherds-pies.html' => 4830, 'food-and-drink/recipes/vegetarian-spinach-enchiladas.html' => 4831, 'food-and-drink/recipes/vegetarian-stuffed-cabbage.html' => 4832, 'food-and-drink/recipes/vegetarian-taco-salad.html' => 4833, 'food-and-drink/recipes/vegetarian-thai-red-curry.html' => 4834, 'food-and-drink/recipes/vegetarian-tikka-masala.html' => 4835, 'food-and-drink/recipes/vegetarian-tortilla-soup.html' => 4836, 'food-and-drink/recipes/veggie-egg-salad.html' => 4837, 'food-and-drink/recipes/veggie-spring-rolls.html' => 4838, 'food-and-drink/recipes/veggistrone.html' => 4839, 'food-and-drink/recipes/velvet-chicken-with-baby-bok-choy.html' => 4840, 'food-and-drink/recipes/very-berry-fruit-salad.html' => 4841, 'food-and-drink/recipes/very-green-lentil-soup.html' => 4842, 'food-and-drink/recipes/very-merry-punch.html' => 4843, 'food-and-drink/recipes/vietnamese-grapefruit-and-pork-salad-(pork-goi-buoi).html' => 4844, 'food-and-drink/recipes/vietnamese-mango-and-chicken-salad.html' => 4845, 'food-and-drink/recipes/vietnamese-shrimp-and-mango-lettuce-wraps.html' => 4846, 'food-and-drink/recipes/vietnamese-spiralized-sesame-noodles-with-scallops.html' => 4847, 'food-and-drink/recipes/vietnamese-tofu-noodle-lettuce-wraps.html' => 4848, 'food-and-drink/recipes/vietnamese-style-beef-and-noodle-broth.html' => 4849, 'food-and-drink/recipes/virgin-garden-fresh-bloody-mary.html' => 4850, 'food-and-drink/recipes/wake-up-smoothie.html' => 4851, 'food-and-drink/recipes/warm-rocket-bread-salad.html' => 4852, 'food-and-drink/recipes/warm-beet-and-spinach-salad.html' => 4853, 'food-and-drink/recipes/warm-chicken-sausage-and-potato-salad.html' => 4854, 'food-and-drink/recipes/warm-dandelion-greens-with-roasted-garlic-dressing.html' => 4855, 'food-and-drink/recipes/warm-fava-bean-and-endive-salad-(scafata).html' => 4856, 'food-and-drink/recipes/warm-green-bean-salad-with-toasted-walnuts.html' => 4857, 'food-and-drink/recipes/warm-lentil-salad-with-sausage-and-apple.html' => 4858, 'food-and-drink/recipes/warm-lentil-salad-with-sausage-and-apple-for-two.html' => 4859, 'food-and-drink/recipes/warm-pear-and-spinach-salad-with-maple-bacon-vinaigrette.html' => 4860, 'food-and-drink/recipes/warm-quinoa-salad-with-edamame-and-tarragon.html' => 4861, 'food-and-drink/recipes/warm-salad-of-greens,-italian-sausage-and-potatoes.html' => 4862, 'food-and-drink/recipes/warm-shrimp-and-rocket-salad.html' => 4863, 'food-and-drink/recipes/warm-snow-pea-and-chicken-salad.html' => 4864, 'food-and-drink/recipes/warm-winter-salad.html' => 4865, 'food-and-drink/recipes/warm-winter-salad-for-two.html' => 4866, 'food-and-drink/recipes/watercress-and-citrus-tabbouleh.html' => 4867, 'food-and-drink/recipes/watercress-and-endive-salad.html' => 4868, 'food-and-drink/recipes/watercress-and-sugar-snap-salad-with-warm-sesame-shallot-vinaigrette.html' => 4869, 'food-and-drink/recipes/watercress-salad-with-sesame-garlic-dressing.html' => 4870, 'food-and-drink/recipes/watercress,-pistachio-and-beet-salad.html' => 4871, 'food-and-drink/recipes/watermelon-and-goat-cheese-salad-with-citrus-vinaigrette.html' => 4872, 'food-and-drink/recipes/watermelon-agua-fresca.html' => 4873, 'food-and-drink/recipes/watermelon-fruit-pizza.html' => 4874, 'food-and-drink/recipes/watermelon-gazpacho.html' => 4875, 'food-and-drink/recipes/watermelon-gin-fizz.html' => 4876, 'food-and-drink/recipes/watermelon-salsa.html' => 4877, 'food-and-drink/recipes/watermelon-slush.html' => 4878, 'food-and-drink/recipes/watermelon-spa-smoothie.html' => 4879, 'food-and-drink/recipes/watermelon-mango-smoothie.html' => 4880, 'food-and-drink/recipes/watermelon-strawberry-smoothie.html' => 4881, 'food-and-drink/recipes/watermelon-turmeric-smoothie.html' => 4882, 'food-and-drink/recipes/west-coast-avocado-toast.html' => 4883, 'food-and-drink/recipes/whipped-berry-pudding.html' => 4884, 'food-and-drink/recipes/white-bean-salad-with-cheddar,-bacon-and-walnuts.html' => 4885, 'food-and-drink/recipes/white-bean-soup-(fassoulatha).html' => 4886, 'food-and-drink/recipes/white-bean-spread-with-veggie-slaw.html' => 4887, 'food-and-drink/recipes/white-chili.html' => 4888, 'food-and-drink/recipes/white-turkey-chili.html' => 4889, 'food-and-drink/recipes/whole-roasted-lemon-herb-chicken-on-a-bed-of-vegetables.html' => 4890, 'food-and-drink/recipes/whole-grain-buttermilk-pancakes.html' => 4891, 'food-and-drink/recipes/whole-grain-waffles-with-cherry-sauce.html' => 4892, 'food-and-drink/recipes/wild-mushroom-soup.html' => 4893, 'food-and-drink/recipes/wild-rice-and-baby-kale-salad-with-persimmons.html' => 4894, 'food-and-drink/recipes/wild-rice-and-mushroom-soup.html' => 4895, 'food-and-drink/recipes/wild-rice-pilaf-with-sweet-potatoes-and-brussels-sprouts.html' => 4896, 'food-and-drink/recipes/wilted-spinach-salad-with-sherry-vinaigrette.html' => 4897, 'food-and-drink/recipes/winter-salad-with-halloumi-“croutons”.html' => 4898, 'food-and-drink/recipes/winter-salad-with-roasted-squash-and-pomegranate-vinaigrette.html' => 4899, 'food-and-drink/recipes/winter-salad-with-toasted-walnuts.html' => 4900, 'food-and-drink/recipes/winter-squash-muffins-with-cranberries.html' => 4901, 'food-and-drink/recipes/winter-squash-risotto.html' => 4902, 'food-and-drink/recipes/winter-vegetable-dal.html' => 4903, 'food-and-drink/recipes/wok-seared-chicken-and-vegetables-(kadhai-murghi).html' => 4904, 'food-and-drink/recipes/wok-seared-chicken-tenders-with-asparagus-and-pistachios.html' => 4905, 'food-and-drink/recipes/yankee-grits.html' => 4906, 'food-and-drink/recipes/yeasted-waffles.html' => 4907, 'food-and-drink/recipes/yellow-gazpacho.html' => 4908, 'food-and-drink/recipes/yellow-sheet-cake-with-cream-cheese-frosting-and-berries.html' => 4909, 'food-and-drink/recipes/zaatar-roasted-chicken-tenders-and-vegetables-with-couscous.html' => 4910, 'food-and-drink/recipes/zesty-shrimp-and-black-bean-salad.html' => 4911, 'food-and-drink/recipes/zesty-shrimp-and-black-bean-salad-for-two.html' => 4912, 'food-and-drink/recipes/courgette-bread-breakfast-pancakes.html' => 4913, 'food-and-drink/recipes/courgette-gratin.html' => 4914, 'food-and-drink/recipes/courgette-noodles-with-avocado-pesto-and-shrimp.html' => 4915, 'food-and-drink/recipes/courgette-rice-casserole.html' => 4916, 'food-and-drink/recipes/rose-and-pistachio-ice-cream.html' => 5307, 'food-and-drink/recipes/courgette,-fennel-and-white-bean-pasta.html' => 4917, 'food-and-drink/recipes/summer-sour-3-in-1.html' => 5308, 'food-and-drink/recipes/turkey-skewers.html' => 5309, 'food-and-drink/recipes/chocolate-mousse-with-raspberries.html' => 5310, 'food-and-drink/recipes/cookie-shots.html' => 5311, 'food-and-drink/recipes/beef-taco.html' => 5312, 'food-and-drink/recipes/easy-pumpkin-muffins.html' => 5313, 'food-and-drink/recipes/homemade-fish-and-jenga-chips.html' => 5314, 'food-and-drink/recipes/low-fat-yogurt-with-granola-and-berries.html' => 5315, 'food-and-drink/recipes/tuna-and-vegetable-pitta-pizza.html' => 5336, 'food-and-drink/recipes/bagel-with-pastrami.html' => 5344, 'food-and-drink/recipes/beef-burger.html' => 5345, 'food-and-drink/recipes/baked-potatoe.html' => 5349, 'food-and-drink/recipes/butternut-squash-soup.html' => 5352, 'food-and-drink/recipes/chicken-tikka-pitta-pockets.html' => 5354, 'food-and-drink/recipes/couscous-roasted-vegetables.html' => 5355, 'food-and-drink/recipes/leek-potato-soup.html' => 5357, 'food-and-drink/recipes/quesadillas.html' => 5359, 'food-and-drink/recipes/smoked-mackerel-pate-recipe.html' => 5364, 'food-and-drink/recipes/chicken-chow-mein-recipe.html' => 5372, 'food-and-drink/recipes/chilli-recipe.html' => 5376, 'food-and-drink/recipes/chicken-fajitas-recipe.html' => 5378, 'food-and-drink/recipes/italian-meatballs-recipe.html' => 5379, 'food-and-drink/recipes/pad-thai-recipe.html' => 5380, 'food-and-drink/recipes/roast-chicken-recipe.html' => 5381, 'food-and-drink/recipes/salmon-with-asparagus.html' => 5382, 'food-and-drink/recipes/spaghetti-bolognese-recipe.html' => 5383, 'food-and-drink/recipes/teriyaki-salmon-recipe.html' => 5384, 'food-and-drink/recipes/thai-green-curry-recipe.html' => 5385, 'food-and-drink/recipes/turkey-burgers-recipe.html' => 5386, 'food-and-drink/recipes/vegetable-stir-fry-recipe.html' => 5387, 'food-and-drink/recipes/low-fat-potato-salad-recipe.html' => 5388, 'food-and-drink/recipes/salsa-recipe.html' => 5389, 'food-and-drink/recipes/sweet-potato-wedges-recipe.html' => 5390, 'food-and-drink/recipes/mexican-scrambled-eggs-recipe.html' => 5391, 'food-and-drink/recipes/omelette-recipe.html' => 5392, 'food-and-drink/recipes/egg-bacon-flan.html' => 5393, 'food-and-drink/recipes/fruity-fondue.html' => 5394, 'food-and-drink/recipes/berry-banana-cooler.html' => 5395, 'downloads/ramadan-calendar.pdf' => 195, 'news/category-2/' => 204, 'news/type-2-diabetes-mellitus/' => 207, 'news/health/' => 5339, 'news/exercise/' => 221, 'news/nutrition-and-diet/' => 212, 'news/weekly-digest-prediabtes-and-type-2-diabetes/' => 224, 'news/category-2/pioglitazone-reduces-fatty-liver-in-prediabete-patients.html' => 228, 'news/category-2/prediabetes-diet.html' => 241, 'news/category-2/5-million-adults-in-england-are-pre-diabetic.html' => 259, 'news/category-2/preventing-type-2-diabetes.html' => 316, 'news/category-2/lifestyle-changes-proven-to-prevent-diabetes.html' => 265, 'news/category-2/vitamin-a-–-a-crucial-ingredient-in-diabetes-prevention.html' => 278, 'news/category-2/doctors-join-the-fight-against-pre-diabetes.html' => 279, 'news/type-2-diabetes-mellitus/managingdiabetes-v2.html' => 243, 'news/type-2-diabetes-mellitus/there-is-a-causal-link-between-smoking-and-type-2-diabetes.html' => 244, 'news/type-2-diabetes-mellitus/government’s-new-sugar-smart-campaign-diabetes-warnings.html' => 248, 'news/type-2-diabetes-mellitus/breaking-news-fat-loss-could-cure-type-2-diabetes.html' => 250, 'news/type-2-diabetes-mellitus/diabetes-and-stress.html' => 253, 'news/type-2-diabetes-mellitus/10-celebrities-you-didn’t-know-had-diabetes.html' => 254, 'news/type-2-diabetes-mellitus/five-steps-to-fight-stress-of-diabetes.html' => 255, 'news/type-2-diabetes-mellitus/how-the-smoking-in-car-ban-can-help-prevent-diabetes.html' => 256, 'news/type-2-diabetes-mellitus/diabetes-drugs-may-release-sugar-into-the-blood.html' => 257, 'news/type-2-diabetes-mellitus/diabetes-related-amputations-at-an-all-time-high.html' => 260, 'news/type-2-diabetes-mellitus/travelling-with-diabetes-what-you-should-know.html' => 261, 'news/type-2-diabetes-mellitus/dolphins-could-help-fight-diabetes.html' => 266, 'news/type-2-diabetes-mellitus/diabetes-smart-patch-could-replace-injections.html' => 267, 'news/type-2-diabetes-mellitus/my-family’s-history-of-diabetes-andrews-interview.html' => 273, 'news/type-2-diabetes-mellitus/scientists-claim-social-jet-lag-is-to-blame-for-diabetes.html' => 276, 'news/type-2-diabetes-mellitus/“living-with-type-1-diabetes-hasn’t-stopped-me-–-garry-sullivans-first-hand-account.html' => 288, 'news/type-2-diabetes-mellitus/world-health-day-2016-spotlight-on-diabetes.html' => 290, 'news/type-2-diabetes-mellitus/my-diabetic-journey-an-interview-with-malcolm-wallace.html' => 314, 'news/type-2-diabetes-mellitus/diabetes-doesn’t-take-a-summer-holiday.html' => 300, 'news/type-2-diabetes-mellitus/could-you-have-type-2-diabetes.html' => 327, 'news/type-2-diabetes-mellitus/should-you-be-having-that-cigarette.html' => 337, 'news/type-2-diabetes-mellitus/are-you-getting-enough-sleep.html' => 349, 'news/type-2-diabetes-mellitus/world-diabetes-day-2016.html' => 350, 'news/type-2-diabetes-mellitus/fight-against-diabetes-with-dab4diabetes.html' => 352, 'news/nutrition-and-diet/bank-holiday-weekend-–-how-to-cheat-your-cheat-days!.html' => 232, 'news/nutrition-and-diet/new-publicity-exposes-“lurking-sugar”-and-how-to-find-it.html' => 247, 'news/nutrition-and-diet/10-healthy-autumn-recipes-which-help-you.html' => 251, 'news/nutrition-and-diet/calorie-control-tip-don’t-just-cut-it,-change-it.html' => 252, 'news/nutrition-and-diet/why-a-good-diabetic-diet-is-more-important-than-ever.html' => 258, 'news/nutrition-and-diet/what-is-a-dietitian-mairi-huntley-explains.html' => 262, 'news/nutrition-and-diet/food-order-influences-blood-sugar-levels.html' => 264, 'news/nutrition-and-diet/healthy-eating-for-people-with-diabetes.html' => 268, 'news/nutrition-and-diet/fizzy-drinks-linked-to-heart-disease,-diabetes,-cancer.html' => 269, 'news/nutrition-and-diet/introducing-mairi-huntly.html' => 270, 'news/nutrition-and-diet/snack-bar-cure-for-type-2-diabetes.html' => 271, 'news/nutrition-and-diet/healthy-eating.html' => 272, 'news/nutrition-and-diet/tesco-joins-the-fight-against-obesity.html' => 275, 'news/nutrition-and-diet/mandatory-food-industry-regulations-called-for.html' => 277, 'news/nutrition-and-diet/the-world’s-best-diet.html' => 280, 'news/nutrition-and-diet/sweet-poison.html' => 281, 'news/nutrition-and-diet/sugar-tax-–-is-the-sugar-tax-a-hard-pill-to-swallow-well-to-sugar-coat-it-might-one-day-cost-you-more!.html' => 282, 'news/nutrition-and-diet/whats-the-right-diet-for-you.html' => 283, 'news/nutrition-and-diet/health-danger-in-fruit-juice.html' => 289, 'news/nutrition-and-diet/10-foods-to-try.html' => 291, 'news/nutrition-and-diet/super-foods-lead-to-a-super-diet!.html' => 323, 'news/nutrition-and-diet/staying-healthy-this-winter.html' => 351, 'news/nutrition-and-diet/are-you-on-top-of-your-diet.html' => 5343, 'news/nutrition-and-diet/are-you-ready-for-pancake-day.html' => 5361, 'news/nutrition-and-diet/eat-well-and-live-well.html' => 5363, 'news/nutrition-and-diet/managing-easter-eats.html' => 5365, 'news/nutrition-and-diet/stop-cravings-and-start-living.html' => 5367, 'news/nutrition-and-diet/fad-diets-be-gone!.html' => 5368, 'news/nutrition-and-diet/what’s-the-true-cost-of-convenience-food-to-britain.html' => 5370, 'news/nutrition-and-diet/fasting-–-the-unexpected-benefits….html' => 5373, 'news/nutrition-and-diet/when-life-gives-you-lemons….html' => 5374, 'news/nutrition-and-diet/the-mighty-power-of-midget-trees!.html' => 5375, 'news/nutrition-and-diet/exploring-tasty-turmeric;-a-truly-super-spice.html' => 5377, 'news/exercise/30-x-30-challenge!-prediabetes.html' => 222, 'news/exercise/top-5-activities-you-can-give-a-go!.html' => 263, 'news/exercise/exercising-a-small-amount-everyday-is-possible!.html' => 274, 'news/exercise/brisk-walking-combats-prediabetes.html' => 304, 'news/exercise/housework-could-reduce-the-risk-of-developing-diabetes.html' => 308, 'news/exercise/mastering-pokemon-go!-prediabetes.html' => 313, 'news/exercise/deskercise-–-exercise-for-those-of-us-stuck-behind-desks.html' => 321, 'news/exercise/can-balance-exercises-help-diabetics.html' => 334, 'news/exercise/don’t-hibernate-this-winter.html' => 5342, 'news/exercise/why-you-should-exercise-in-the-morning.html' => 5356, 'news/exercise/blast-that-fat.html' => 5362, 'news/exercise/are-short-workouts-worth-it.html' => 5366, 'news/exercise/who-likes-to-exercise-anyway.html' => 5371, 'tools/ask-the-expert/categories/' => 907, 'tools/ask-the-expert/ask-the-expert-search.html' => 931, 'feeder/development/' => 4918, 'tools/ask-the-expert/categories/health.html' => 908, 'tools/ask-the-expert/categories/food.html' => 909, 'tools/ask-the-expert/categories/exercise.html' => 910, 'tools/ask-the-expert/categories/meal-planning.html' => 911, 'tools/ask-the-expert/categories/prediabetes.html' => 912, 'tools/ask-the-expert/categories/type-1-diabetes.html' => 913, 'tools/ask-the-expert/categories/type-2-diabetes.html' => 914, 'tools/ask-the-expert/categories/diabetes-prevention.html' => 915, 'tools/ask-the-expert/categories/reversing-diabetes.html' => 916, 'tools/ask-the-expert/categories/obesity.html' => 917, 'tools/ask-the-expert/categories/recipes.html' => 918, 'tools/ask-the-expert/categories/healthy-living.html' => 919, 'tools/ask-the-expert/categories/dieting.html' => 920, 'tools/ask-the-expert/categories/bmi-calculating.html' => 921, 'tools/ask-the-expert/categories/weight-issues.html' => 922, 'tools/ask-the-expert/categories/diabetes-facts.html' => 923, 'tools/ask-the-expert/categories/diabetes-statistics.html' => 924, 'tools/ask-the-expert/categories/diabetes-news.html' => 925, 'tools/ask-the-expert/categories/diabetes-blogs.html' => 926, 'tools/ask-the-expert/categories/motivation.html' => 927, 'tools/ask-the-expert/categories/other.html' => 928, 'feeder/development/thanks.html' => 4919, 'health/prediabetes.html' => 2, 'health/type-2-diabetes.html' => 4943, 'health/pre-hypertension.html' => 4944, 'health/hypertension.html' => 4945, 'health/heart-disease.html' => 4946, 'health/obesity.html' => 4947, 'health/stroke.html' => 4948, 'health/heart-failure.html' => 4949, 'health/chd-–-congestive-heart-disease.html' => 4950, 'health/retinopathy.html' => 4951, 'health/liver-disease.html' => 4952, 'health/kidney-function.html' => 4954, 'menu/left-menu/' => 5317, 'menu/left-menu/home.html' => 5318, 'menu/left-menu/resources/' => 5319, 'menu/left-menu/food/' => 5322, 'menu/left-menu/exercise/' => 5326, 'menu/left-menu/health/' => 5329, 'menu/left-menu/news.html' => 5333, 'menu/left-menu/videos.html' => 5334, 'menu/left-menu/resources/key-facts.html' => 5320, 'menu/left-menu/resources/glossary.html' => 5321, 'menu/left-menu/food/recipes.html' => 5323, 'menu/left-menu/food/meal-planner.html' => 5324, 'menu/left-menu/food/eatwell-plate.html' => 5325, 'menu/left-menu/exercise/exercise.html' => 5327, 'menu/left-menu/exercise/videos.html' => 5328, 'menu/left-menu/health/body-diagram.html' => 5330, 'menu/left-menu/health/essential-health-check.html' => 5331, 'menu/left-menu/health/prediabetes.html' => 5332, 'news/health/stoptober-competition-winners.html' => 5340, 'news/health/christmas-gifts-for-the-healthiest-person-you-know.html' => 5348, 'news/health/new-year,-new-you.html' => 5353, 'news/health/are-you-obese.html' => 5360, 'news/health/are-we-becoming-a-nation-of-insomniacs.html' => 5369, ), 'resourceMap' => array ( 0 => array ( 0 => 1, 1 => 3, 2 => 5, 3 => 202, 4 => 7, 5 => 8, 6 => 9, 7 => 29, 8 => 30, 9 => 31, 10 => 37, 11 => 108, 12 => 194, 13 => 199, 14 => 360, 15 => 219, 16 => 4942, 17 => 5316, 18 => 52, 19 => 5358, ), 3 => array ( 0 => 157, ), 5 => array ( 0 => 4940, ), 7 => array ( 0 => 11, 1 => 12, 2 => 13, 3 => 14, 4 => 15, 5 => 16, 6 => 17, 7 => 18, 8 => 196, 9 => 359, ), 9 => array ( 0 => 24, ), 17 => array ( 0 => 101, 1 => 102, 2 => 103, 3 => 104, 4 => 105, 5 => 106, 6 => 107, ), 18 => array ( 0 => 2647, ), 37 => array ( 0 => 38, 1 => 39, 2 => 40, 3 => 41, 4 => 49, 5 => 148, 6 => 149, 7 => 929, 8 => 932, 9 => 4926, ), 49 => array ( 0 => 151, ), 52 => array ( 0 => 50, 1 => 51, ), 108 => array ( 0 => 109, ), 109 => array ( 0 => 111, 1 => 112, 2 => 233, ), 157 => array ( 0 => 3450, 1 => 3451, 2 => 3452, 3 => 3453, 4 => 3454, 5 => 3455, 6 => 3456, 7 => 3457, 8 => 3458, 9 => 3459, 10 => 3460, 11 => 3461, 12 => 3462, 13 => 3463, 14 => 3464, 15 => 3465, 16 => 3466, 17 => 3467, 18 => 3468, 19 => 3469, 20 => 3470, 21 => 3471, 22 => 3472, 23 => 3473, 24 => 3474, 25 => 3475, 26 => 3476, 27 => 3477, 28 => 3478, 29 => 3479, 30 => 3480, 31 => 3481, 32 => 3482, 33 => 3483, 34 => 3484, 35 => 3485, 36 => 3486, 37 => 3487, 38 => 3488, 39 => 3489, 40 => 3490, 41 => 3491, 42 => 3492, 43 => 3493, 44 => 3494, 45 => 3495, 46 => 3496, 47 => 3497, 48 => 3498, 49 => 3499, 50 => 3500, 51 => 3501, 52 => 3502, 53 => 3503, 54 => 3504, 55 => 3505, 56 => 3506, 57 => 3507, 58 => 3508, 59 => 3509, 60 => 3510, 61 => 3511, 62 => 3512, 63 => 3513, 64 => 3514, 65 => 3515, 66 => 3516, 67 => 3517, 68 => 3518, 69 => 3519, 70 => 3520, 71 => 3521, 72 => 3522, 73 => 3523, 74 => 3524, 75 => 3525, 76 => 3526, 77 => 3527, 78 => 3528, 79 => 3529, 80 => 3530, 81 => 3531, 82 => 3532, 83 => 3533, 84 => 3534, 85 => 3535, 86 => 3536, 87 => 3537, 88 => 3538, 89 => 3539, 90 => 3540, 91 => 3541, 92 => 3542, 93 => 3543, 94 => 3544, 95 => 3545, 96 => 3546, 97 => 3547, 98 => 3548, 99 => 3549, 100 => 3550, 101 => 3551, 102 => 3552, 103 => 3553, 104 => 3554, 105 => 3555, 106 => 3556, 107 => 3557, 108 => 3558, 109 => 3559, 110 => 3560, 111 => 3561, 112 => 3562, 113 => 3563, 114 => 3564, 115 => 3565, 116 => 3566, 117 => 3567, 118 => 3568, 119 => 3569, 120 => 3570, 121 => 3571, 122 => 3572, 123 => 3573, 124 => 3574, 125 => 3575, 126 => 3576, 127 => 3577, 128 => 3578, 129 => 3579, 130 => 3580, 131 => 3581, 132 => 3582, 133 => 3583, 134 => 3584, 135 => 3585, 136 => 3586, 137 => 3587, 138 => 3588, 139 => 3589, 140 => 3590, 141 => 3591, 142 => 3592, 143 => 3593, 144 => 3594, 145 => 3595, 146 => 3596, 147 => 3597, 148 => 3598, 149 => 3599, 150 => 3600, 151 => 3601, 152 => 3602, 153 => 3603, 154 => 3604, 155 => 3605, 156 => 3606, 157 => 3607, 158 => 3608, 159 => 3609, 160 => 3610, 161 => 3611, 162 => 3612, 163 => 3613, 164 => 3614, 165 => 3615, 166 => 3616, 167 => 3617, 168 => 3618, 169 => 3619, 170 => 3620, 171 => 3621, 172 => 3622, 173 => 3623, 174 => 3624, 175 => 3625, 176 => 3626, 177 => 3628, 178 => 3629, 179 => 3630, 180 => 3631, 181 => 3632, 182 => 3633, 183 => 3634, 184 => 3635, 185 => 3636, 186 => 3637, 187 => 3638, 188 => 3639, 189 => 3640, 190 => 3641, 191 => 3642, 192 => 3643, 193 => 3644, 194 => 3645, 195 => 3646, 196 => 3647, 197 => 3648, 198 => 3649, 199 => 3650, 200 => 3651, 201 => 3652, 202 => 3653, 203 => 3654, 204 => 3655, 205 => 3656, 206 => 3657, 207 => 3658, 208 => 3659, 209 => 3660, 210 => 3661, 211 => 3662, 212 => 3663, 213 => 3664, 214 => 3665, 215 => 3666, 216 => 3667, 217 => 3668, 218 => 3669, 219 => 3670, 220 => 3671, 221 => 3672, 222 => 3673, 223 => 3674, 224 => 3675, 225 => 3676, 226 => 3677, 227 => 3678, 228 => 3679, 229 => 3680, 230 => 3681, 231 => 3682, 232 => 3683, 233 => 3684, 234 => 3685, 235 => 3686, 236 => 3687, 237 => 3688, 238 => 3689, 239 => 3690, 240 => 3691, 241 => 3692, 242 => 3693, 243 => 3694, 244 => 3695, 245 => 3696, 246 => 3697, 247 => 3698, 248 => 3699, 249 => 3700, 250 => 3701, 251 => 3702, 252 => 3703, 253 => 3704, 254 => 3705, 255 => 3706, 256 => 3707, 257 => 3708, 258 => 3709, 259 => 3710, 260 => 3711, 261 => 3712, 262 => 3713, 263 => 3714, 264 => 3715, 265 => 3716, 266 => 3717, 267 => 3718, 268 => 3719, 269 => 3720, 270 => 3721, 271 => 3722, 272 => 3723, 273 => 3724, 274 => 3725, 275 => 3726, 276 => 3727, 277 => 3728, 278 => 3729, 279 => 3730, 280 => 3731, 281 => 3732, 282 => 3733, 283 => 3734, 284 => 3735, 285 => 3736, 286 => 3737, 287 => 3738, 288 => 3739, 289 => 3740, 290 => 3741, 291 => 3742, 292 => 3743, 293 => 3744, 294 => 3745, 295 => 3746, 296 => 3747, 297 => 3748, 298 => 3749, 299 => 3750, 300 => 3751, 301 => 3752, 302 => 3753, 303 => 3754, 304 => 3755, 305 => 3756, 306 => 3757, 307 => 3758, 308 => 3759, 309 => 3760, 310 => 3761, 311 => 3762, 312 => 3763, 313 => 3764, 314 => 3765, 315 => 3766, 316 => 3767, 317 => 3768, 318 => 3769, 319 => 3770, 320 => 3771, 321 => 3772, 322 => 3773, 323 => 3774, 324 => 3775, 325 => 3776, 326 => 3777, 327 => 3778, 328 => 3779, 329 => 3780, 330 => 3781, 331 => 3782, 332 => 3783, 333 => 3784, 334 => 3785, 335 => 3786, 336 => 3787, 337 => 3788, 338 => 3789, 339 => 3790, 340 => 3791, 341 => 3792, 342 => 3793, 343 => 3794, 344 => 3795, 345 => 3796, 346 => 3797, 347 => 3798, 348 => 3799, 349 => 3800, 350 => 3801, 351 => 3802, 352 => 3803, 353 => 3804, 354 => 3805, 355 => 3806, 356 => 3807, 357 => 3808, 358 => 3809, 359 => 3810, 360 => 3811, 361 => 3812, 362 => 3813, 363 => 3814, 364 => 3815, 365 => 3816, 366 => 3817, 367 => 3818, 368 => 3819, 369 => 3820, 370 => 3821, 371 => 3822, 372 => 3823, 373 => 3824, 374 => 3825, 375 => 3826, 376 => 3827, 377 => 3828, 378 => 3829, 379 => 3830, 380 => 3831, 381 => 3832, 382 => 3833, 383 => 3834, 384 => 3835, 385 => 3836, 386 => 3837, 387 => 3838, 388 => 3839, 389 => 3840, 390 => 3841, 391 => 3842, 392 => 3843, 393 => 3844, 394 => 3845, 395 => 3846, 396 => 3847, 397 => 3848, 398 => 3849, 399 => 3850, 400 => 3851, 401 => 3852, 402 => 3853, 403 => 3854, 404 => 3855, 405 => 3856, 406 => 3857, 407 => 3858, 408 => 3859, 409 => 3860, 410 => 3861, 411 => 3862, 412 => 3863, 413 => 3864, 414 => 3865, 415 => 3866, 416 => 3867, 417 => 3868, 418 => 3869, 419 => 3870, 420 => 3871, 421 => 3872, 422 => 3873, 423 => 3874, 424 => 3875, 425 => 3876, 426 => 3877, 427 => 3878, 428 => 3879, 429 => 3880, 430 => 3881, 431 => 3882, 432 => 3883, 433 => 3884, 434 => 3885, 435 => 3886, 436 => 3887, 437 => 3889, 438 => 3890, 439 => 3891, 440 => 3892, 441 => 3893, 442 => 3894, 443 => 3895, 444 => 3896, 445 => 3897, 446 => 3898, 447 => 3899, 448 => 3900, 449 => 3901, 450 => 3902, 451 => 3903, 452 => 3904, 453 => 3905, 454 => 3906, 455 => 3907, 456 => 3908, 457 => 3909, 458 => 3910, 459 => 3911, 460 => 3912, 461 => 3913, 462 => 3914, 463 => 3915, 464 => 3916, 465 => 3917, 466 => 3918, 467 => 3919, 468 => 3920, 469 => 3921, 470 => 3922, 471 => 3923, 472 => 3924, 473 => 3925, 474 => 3926, 475 => 3927, 476 => 3928, 477 => 3929, 478 => 3930, 479 => 3931, 480 => 3932, 481 => 3933, 482 => 3934, 483 => 3935, 484 => 3936, 485 => 3937, 486 => 3938, 487 => 3939, 488 => 3940, 489 => 3941, 490 => 3942, 491 => 3943, 492 => 3944, 493 => 3945, 494 => 3946, 495 => 3947, 496 => 3948, 497 => 3949, 498 => 3950, 499 => 3951, 500 => 3952, 501 => 3953, 502 => 3954, 503 => 3955, 504 => 3956, 505 => 3957, 506 => 3958, 507 => 3959, 508 => 3960, 509 => 3961, 510 => 3962, 511 => 3963, 512 => 3964, 513 => 3965, 514 => 3966, 515 => 3967, 516 => 3968, 517 => 3969, 518 => 3970, 519 => 3971, 520 => 3972, 521 => 3973, 522 => 3974, 523 => 3975, 524 => 3976, 525 => 3977, 526 => 3978, 527 => 3979, 528 => 3980, 529 => 3981, 530 => 3982, 531 => 3983, 532 => 3984, 533 => 3985, 534 => 3986, 535 => 3987, 536 => 3988, 537 => 3989, 538 => 3990, 539 => 3991, 540 => 3992, 541 => 3993, 542 => 3994, 543 => 3995, 544 => 3996, 545 => 3997, 546 => 3998, 547 => 3999, 548 => 4000, 549 => 4001, 550 => 4002, 551 => 4003, 552 => 4004, 553 => 4005, 554 => 4006, 555 => 4007, 556 => 4008, 557 => 4009, 558 => 4010, 559 => 4011, 560 => 4012, 561 => 4013, 562 => 4014, 563 => 4015, 564 => 4016, 565 => 4017, 566 => 4018, 567 => 4019, 568 => 4020, 569 => 4021, 570 => 4022, 571 => 4023, 572 => 4024, 573 => 4025, 574 => 4026, 575 => 4027, 576 => 4028, 577 => 4029, 578 => 4030, 579 => 4031, 580 => 4032, 581 => 4033, 582 => 4034, 583 => 4035, 584 => 4036, 585 => 4037, 586 => 4038, 587 => 4039, 588 => 4040, 589 => 4041, 590 => 4042, 591 => 4043, 592 => 4044, 593 => 4045, 594 => 4046, 595 => 4047, 596 => 4048, 597 => 4049, 598 => 4050, 599 => 4051, 600 => 4052, 601 => 4053, 602 => 4054, 603 => 4055, 604 => 4056, 605 => 4057, 606 => 4058, 607 => 4059, 608 => 4060, 609 => 4061, 610 => 4062, 611 => 4063, 612 => 4064, 613 => 4065, 614 => 4066, 615 => 4067, 616 => 4068, 617 => 4069, 618 => 4070, 619 => 4071, 620 => 4072, 621 => 4073, 622 => 4074, 623 => 4075, 624 => 4076, 625 => 4077, 626 => 4078, 627 => 4079, 628 => 4080, 629 => 4081, 630 => 4082, 631 => 4083, 632 => 4084, 633 => 4085, 634 => 4086, 635 => 4087, 636 => 4088, 637 => 4089, 638 => 4090, 639 => 4091, 640 => 4092, 641 => 4093, 642 => 4094, 643 => 4095, 644 => 4096, 645 => 4097, 646 => 4098, 647 => 4099, 648 => 4100, 649 => 4101, 650 => 4102, 651 => 4103, 652 => 4104, 653 => 4105, 654 => 4106, 655 => 4107, 656 => 4108, 657 => 4109, 658 => 4110, 659 => 4111, 660 => 4112, 661 => 4113, 662 => 4114, 663 => 4115, 664 => 4116, 665 => 4117, 666 => 4118, 667 => 4119, 668 => 4120, 669 => 4121, 670 => 4122, 671 => 4123, 672 => 4124, 673 => 4125, 674 => 4126, 675 => 4127, 676 => 4128, 677 => 4129, 678 => 4130, 679 => 4131, 680 => 4132, 681 => 4133, 682 => 4134, 683 => 4135, 684 => 4136, 685 => 4137, 686 => 4138, 687 => 4139, 688 => 4140, 689 => 4141, 690 => 4142, 691 => 4143, 692 => 4144, 693 => 4145, 694 => 4146, 695 => 4147, 696 => 4148, 697 => 4149, 698 => 4150, 699 => 4151, 700 => 4152, 701 => 4153, 702 => 4154, 703 => 4155, 704 => 4156, 705 => 4157, 706 => 4158, 707 => 4159, 708 => 4160, 709 => 4161, 710 => 4162, 711 => 4163, 712 => 4164, 713 => 4165, 714 => 4166, 715 => 4167, 716 => 4168, 717 => 4169, 718 => 4170, 719 => 4171, 720 => 4172, 721 => 4173, 722 => 4174, 723 => 4175, 724 => 4176, 725 => 4177, 726 => 4178, 727 => 4179, 728 => 4180, 729 => 4181, 730 => 4182, 731 => 4183, 732 => 4184, 733 => 4185, 734 => 4186, 735 => 4187, 736 => 4188, 737 => 4189, 738 => 4190, 739 => 4191, 740 => 4192, 741 => 4193, 742 => 4194, 743 => 4195, 744 => 4196, 745 => 4197, 746 => 4198, 747 => 4199, 748 => 4200, 749 => 4201, 750 => 4202, 751 => 4203, 752 => 4204, 753 => 4205, 754 => 4206, 755 => 4207, 756 => 4208, 757 => 4209, 758 => 4210, 759 => 4211, 760 => 4212, 761 => 4213, 762 => 4214, 763 => 4215, 764 => 4216, 765 => 4217, 766 => 4218, 767 => 4219, 768 => 4220, 769 => 4221, 770 => 4222, 771 => 4223, 772 => 4224, 773 => 4225, 774 => 4226, 775 => 4227, 776 => 4228, 777 => 4229, 778 => 4230, 779 => 4231, 780 => 4232, 781 => 4233, 782 => 4234, 783 => 4235, 784 => 4236, 785 => 4237, 786 => 4238, 787 => 4239, 788 => 4240, 789 => 4241, 790 => 4242, 791 => 4243, 792 => 4244, 793 => 4245, 794 => 4246, 795 => 4247, 796 => 4248, 797 => 4249, 798 => 4250, 799 => 4251, 800 => 4252, 801 => 4253, 802 => 4254, 803 => 4255, 804 => 4256, 805 => 4257, 806 => 4258, 807 => 4259, 808 => 4260, 809 => 4261, 810 => 4262, 811 => 4263, 812 => 4264, 813 => 4265, 814 => 4266, 815 => 4267, 816 => 4268, 817 => 4269, 818 => 4270, 819 => 4271, 820 => 4272, 821 => 4273, 822 => 4274, 823 => 4275, 824 => 4276, 825 => 4277, 826 => 4278, 827 => 4279, 828 => 4280, 829 => 4281, 830 => 4282, 831 => 4283, 832 => 4284, 833 => 4285, 834 => 4286, 835 => 4287, 836 => 4288, 837 => 4289, 838 => 4290, 839 => 4291, 840 => 4292, 841 => 4293, 842 => 4294, 843 => 4295, 844 => 4296, 845 => 4297, 846 => 4298, 847 => 4299, 848 => 4300, 849 => 4301, 850 => 4302, 851 => 4303, 852 => 4304, 853 => 4305, 854 => 4306, 855 => 4307, 856 => 4308, 857 => 4309, 858 => 4310, 859 => 4311, 860 => 4312, 861 => 4313, 862 => 4314, 863 => 4315, 864 => 4316, 865 => 4317, 866 => 4318, 867 => 4319, 868 => 4320, 869 => 4321, 870 => 4322, 871 => 4323, 872 => 4324, 873 => 4325, 874 => 4326, 875 => 4327, 876 => 4328, 877 => 4329, 878 => 4330, 879 => 4331, 880 => 4332, 881 => 4333, 882 => 4334, 883 => 4335, 884 => 4336, 885 => 4337, 886 => 4338, 887 => 4339, 888 => 4340, 889 => 4341, 890 => 4342, 891 => 4343, 892 => 4344, 893 => 4345, 894 => 4346, 895 => 4347, 896 => 4348, 897 => 4349, 898 => 4350, 899 => 4351, 900 => 4352, 901 => 4353, 902 => 4354, 903 => 4355, 904 => 4356, 905 => 4357, 906 => 4358, 907 => 4359, 908 => 4360, 909 => 4361, 910 => 4362, 911 => 4363, 912 => 4364, 913 => 4365, 914 => 4366, 915 => 4367, 916 => 4368, 917 => 4369, 918 => 4370, 919 => 4371, 920 => 4372, 921 => 4373, 922 => 4374, 923 => 4375, 924 => 4376, 925 => 4377, 926 => 4378, 927 => 4379, 928 => 4380, 929 => 4381, 930 => 4382, 931 => 4383, 932 => 4384, 933 => 4385, 934 => 4386, 935 => 4387, 936 => 4388, 937 => 4389, 938 => 4390, 939 => 4391, 940 => 4392, 941 => 4393, 942 => 4394, 943 => 4395, 944 => 4396, 945 => 4397, 946 => 4398, 947 => 4399, 948 => 4400, 949 => 4401, 950 => 4402, 951 => 4403, 952 => 4404, 953 => 4405, 954 => 4406, 955 => 4407, 956 => 4408, 957 => 4409, 958 => 4410, 959 => 4411, 960 => 4412, 961 => 4413, 962 => 4414, 963 => 4415, 964 => 4416, 965 => 4417, 966 => 4418, 967 => 4419, 968 => 4420, 969 => 4421, 970 => 4422, 971 => 4423, 972 => 4424, 973 => 4425, 974 => 4426, 975 => 4427, 976 => 4428, 977 => 4429, 978 => 4430, 979 => 4431, 980 => 4432, 981 => 4433, 982 => 4434, 983 => 4435, 984 => 4436, 985 => 4437, 986 => 4438, 987 => 4439, 988 => 4440, 989 => 4441, 990 => 4442, 991 => 4443, 992 => 4444, 993 => 4445, 994 => 4446, 995 => 4447, 996 => 4448, 997 => 4449, 998 => 4450, 999 => 4451, 1000 => 4452, 1001 => 4453, 1002 => 4454, 1003 => 4455, 1004 => 4456, 1005 => 4457, 1006 => 4458, 1007 => 4459, 1008 => 4460, 1009 => 4461, 1010 => 4462, 1011 => 4463, 1012 => 4464, 1013 => 4465, 1014 => 4466, 1015 => 4467, 1016 => 4468, 1017 => 4469, 1018 => 4470, 1019 => 4471, 1020 => 4472, 1021 => 4473, 1022 => 4474, 1023 => 4475, 1024 => 4476, 1025 => 4477, 1026 => 4478, 1027 => 4479, 1028 => 4480, 1029 => 4481, 1030 => 4482, 1031 => 4483, 1032 => 4484, 1033 => 4485, 1034 => 4486, 1035 => 4487, 1036 => 4488, 1037 => 4489, 1038 => 4490, 1039 => 4491, 1040 => 4492, 1041 => 4493, 1042 => 4494, 1043 => 4495, 1044 => 4496, 1045 => 4497, 1046 => 4498, 1047 => 4499, 1048 => 4500, 1049 => 4501, 1050 => 4502, 1051 => 4503, 1052 => 4504, 1053 => 4505, 1054 => 4506, 1055 => 4507, 1056 => 4508, 1057 => 4509, 1058 => 4510, 1059 => 4511, 1060 => 4512, 1061 => 4513, 1062 => 4514, 1063 => 4515, 1064 => 4516, 1065 => 4517, 1066 => 4518, 1067 => 4519, 1068 => 4520, 1069 => 4521, 1070 => 4522, 1071 => 4523, 1072 => 4524, 1073 => 4525, 1074 => 4526, 1075 => 4527, 1076 => 4528, 1077 => 4529, 1078 => 4530, 1079 => 4531, 1080 => 4532, 1081 => 4533, 1082 => 4534, 1083 => 4535, 1084 => 4536, 1085 => 4537, 1086 => 4538, 1087 => 4539, 1088 => 4540, 1089 => 4541, 1090 => 4542, 1091 => 4543, 1092 => 4544, 1093 => 4545, 1094 => 4546, 1095 => 4547, 1096 => 4548, 1097 => 4549, 1098 => 4550, 1099 => 4551, 1100 => 4552, 1101 => 4553, 1102 => 4554, 1103 => 4555, 1104 => 4556, 1105 => 4557, 1106 => 4558, 1107 => 4559, 1108 => 4560, 1109 => 4561, 1110 => 4562, 1111 => 4563, 1112 => 4564, 1113 => 4565, 1114 => 4566, 1115 => 4567, 1116 => 4568, 1117 => 4569, 1118 => 4570, 1119 => 4571, 1120 => 4572, 1121 => 4573, 1122 => 4574, 1123 => 4575, 1124 => 4576, 1125 => 4577, 1126 => 4578, 1127 => 4579, 1128 => 4580, 1129 => 4581, 1130 => 4582, 1131 => 4583, 1132 => 4584, 1133 => 4585, 1134 => 4586, 1135 => 4587, 1136 => 4588, 1137 => 4589, 1138 => 4590, 1139 => 4591, 1140 => 4592, 1141 => 4593, 1142 => 4594, 1143 => 4595, 1144 => 4596, 1145 => 4597, 1146 => 4598, 1147 => 4599, 1148 => 4600, 1149 => 4601, 1150 => 4602, 1151 => 4603, 1152 => 4604, 1153 => 4605, 1154 => 4606, 1155 => 4607, 1156 => 4608, 1157 => 4609, 1158 => 4610, 1159 => 4611, 1160 => 4612, 1161 => 4613, 1162 => 4614, 1163 => 4615, 1164 => 4616, 1165 => 4617, 1166 => 4618, 1167 => 4619, 1168 => 4620, 1169 => 4621, 1170 => 4622, 1171 => 4623, 1172 => 4624, 1173 => 4625, 1174 => 4626, 1175 => 4627, 1176 => 4628, 1177 => 4629, 1178 => 4630, 1179 => 4631, 1180 => 4632, 1181 => 4633, 1182 => 4634, 1183 => 4635, 1184 => 4636, 1185 => 4637, 1186 => 4638, 1187 => 4639, 1188 => 4640, 1189 => 4641, 1190 => 4642, 1191 => 4643, 1192 => 4644, 1193 => 4645, 1194 => 4646, 1195 => 4647, 1196 => 4648, 1197 => 4649, 1198 => 4650, 1199 => 4651, 1200 => 4652, 1201 => 4653, 1202 => 4654, 1203 => 4655, 1204 => 4656, 1205 => 4657, 1206 => 4658, 1207 => 4659, 1208 => 4660, 1209 => 4661, 1210 => 4662, 1211 => 4663, 1212 => 4664, 1213 => 4665, 1214 => 4666, 1215 => 4667, 1216 => 4668, 1217 => 4669, 1218 => 4670, 1219 => 4671, 1220 => 4672, 1221 => 4673, 1222 => 4674, 1223 => 4675, 1224 => 4676, 1225 => 4677, 1226 => 4678, 1227 => 4679, 1228 => 4680, 1229 => 4681, 1230 => 4682, 1231 => 4683, 1232 => 4684, 1233 => 4685, 1234 => 4686, 1235 => 4687, 1236 => 4688, 1237 => 4689, 1238 => 4690, 1239 => 4691, 1240 => 4692, 1241 => 4693, 1242 => 4694, 1243 => 4695, 1244 => 4696, 1245 => 4697, 1246 => 4698, 1247 => 4699, 1248 => 4700, 1249 => 4701, 1250 => 4702, 1251 => 4703, 1252 => 4704, 1253 => 4705, 1254 => 4706, 1255 => 4707, 1256 => 4708, 1257 => 4709, 1258 => 4710, 1259 => 4711, 1260 => 4712, 1261 => 4713, 1262 => 4714, 1263 => 4715, 1264 => 4716, 1265 => 4717, 1266 => 4718, 1267 => 4719, 1268 => 4720, 1269 => 4721, 1270 => 4722, 1271 => 4723, 1272 => 4724, 1273 => 4725, 1274 => 4726, 1275 => 4727, 1276 => 4728, 1277 => 4729, 1278 => 4730, 1279 => 4731, 1280 => 4732, 1281 => 4733, 1282 => 4734, 1283 => 4735, 1284 => 4736, 1285 => 4737, 1286 => 4738, 1287 => 4739, 1288 => 4740, 1289 => 4741, 1290 => 4742, 1291 => 4743, 1292 => 4744, 1293 => 4745, 1294 => 4746, 1295 => 4747, 1296 => 4748, 1297 => 4749, 1298 => 4750, 1299 => 4751, 1300 => 4752, 1301 => 4753, 1302 => 4754, 1303 => 4755, 1304 => 4756, 1305 => 4757, 1306 => 4758, 1307 => 4759, 1308 => 4760, 1309 => 4761, 1310 => 4762, 1311 => 4763, 1312 => 4764, 1313 => 4765, 1314 => 4766, 1315 => 4767, 1316 => 4768, 1317 => 4769, 1318 => 4770, 1319 => 4771, 1320 => 4772, 1321 => 4773, 1322 => 4774, 1323 => 4775, 1324 => 4776, 1325 => 4777, 1326 => 4778, 1327 => 4779, 1328 => 4780, 1329 => 4781, 1330 => 4782, 1331 => 4783, 1332 => 4784, 1333 => 4785, 1334 => 4786, 1335 => 4787, 1336 => 4788, 1337 => 4789, 1338 => 4790, 1339 => 4791, 1340 => 4792, 1341 => 4793, 1342 => 4794, 1343 => 4795, 1344 => 4796, 1345 => 4797, 1346 => 4798, 1347 => 4799, 1348 => 4800, 1349 => 4801, 1350 => 4802, 1351 => 4803, 1352 => 4804, 1353 => 4805, 1354 => 4806, 1355 => 4807, 1356 => 4808, 1357 => 4809, 1358 => 4810, 1359 => 4811, 1360 => 4812, 1361 => 4813, 1362 => 4814, 1363 => 4815, 1364 => 4816, 1365 => 4817, 1366 => 4818, 1367 => 4819, 1368 => 4820, 1369 => 4821, 1370 => 4822, 1371 => 4823, 1372 => 4824, 1373 => 4825, 1374 => 4826, 1375 => 4827, 1376 => 4828, 1377 => 4829, 1378 => 4830, 1379 => 4831, 1380 => 4832, 1381 => 4833, 1382 => 4834, 1383 => 4835, 1384 => 4836, 1385 => 4837, 1386 => 4838, 1387 => 4839, 1388 => 4840, 1389 => 4841, 1390 => 4842, 1391 => 4843, 1392 => 4844, 1393 => 4845, 1394 => 4846, 1395 => 4847, 1396 => 4848, 1397 => 4849, 1398 => 4850, 1399 => 4851, 1400 => 4852, 1401 => 4853, 1402 => 4854, 1403 => 4855, 1404 => 4856, 1405 => 4857, 1406 => 4858, 1407 => 4859, 1408 => 4860, 1409 => 4861, 1410 => 4862, 1411 => 4863, 1412 => 4864, 1413 => 4865, 1414 => 4866, 1415 => 4867, 1416 => 4868, 1417 => 4869, 1418 => 4870, 1419 => 4871, 1420 => 4872, 1421 => 4873, 1422 => 4874, 1423 => 4875, 1424 => 4876, 1425 => 4877, 1426 => 4878, 1427 => 4879, 1428 => 4880, 1429 => 4881, 1430 => 4882, 1431 => 4883, 1432 => 4884, 1433 => 4885, 1434 => 4886, 1435 => 4887, 1436 => 4888, 1437 => 4889, 1438 => 4890, 1439 => 4891, 1440 => 4892, 1441 => 4893, 1442 => 4894, 1443 => 4895, 1444 => 4896, 1445 => 4897, 1446 => 4898, 1447 => 4899, 1448 => 4900, 1449 => 4901, 1450 => 4902, 1451 => 4903, 1452 => 4904, 1453 => 4905, 1454 => 4906, 1455 => 4907, 1456 => 4908, 1457 => 4909, 1458 => 4910, 1459 => 4911, 1460 => 4912, 1461 => 4913, 1462 => 4914, 1463 => 4915, 1464 => 4916, 1465 => 5307, 1466 => 4917, 1467 => 5308, 1468 => 5309, 1469 => 5310, 1470 => 5311, 1471 => 5312, 1472 => 5313, 1473 => 5314, 1474 => 5315, 1475 => 5336, 1476 => 5344, 1477 => 5345, 1478 => 5349, 1479 => 5352, 1480 => 5354, 1481 => 5355, 1482 => 5357, 1483 => 5359, 1484 => 5364, 1485 => 5372, 1486 => 5376, 1487 => 5378, 1488 => 5379, 1489 => 5380, 1490 => 5381, 1491 => 5382, 1492 => 5383, 1493 => 5384, 1494 => 5385, 1495 => 5386, 1496 => 5387, 1497 => 5388, 1498 => 5389, 1499 => 5390, 1500 => 5391, 1501 => 5392, 1502 => 5393, 1503 => 5394, 1504 => 5395, ), 194 => array ( 0 => 195, ), 202 => array ( 0 => 204, 1 => 207, 2 => 5339, 3 => 221, 4 => 212, 5 => 224, ), 204 => array ( 0 => 228, 1 => 241, 2 => 259, 3 => 316, 4 => 265, 5 => 278, 6 => 279, ), 207 => array ( 0 => 243, 1 => 244, 2 => 248, 3 => 250, 4 => 253, 5 => 254, 6 => 255, 7 => 256, 8 => 257, 9 => 260, 10 => 261, 11 => 266, 12 => 267, 13 => 273, 14 => 276, 15 => 288, 16 => 290, 17 => 314, 18 => 300, 19 => 327, 20 => 337, 21 => 349, 22 => 350, 23 => 352, ), 212 => array ( 0 => 232, 1 => 247, 2 => 251, 3 => 252, 4 => 258, 5 => 262, 6 => 264, 7 => 268, 8 => 269, 9 => 270, 10 => 271, 11 => 272, 12 => 275, 13 => 277, 14 => 280, 15 => 281, 16 => 282, 17 => 283, 18 => 289, 19 => 291, 20 => 323, 21 => 351, 22 => 5343, 23 => 5361, 24 => 5363, 25 => 5365, 26 => 5367, 27 => 5368, 28 => 5370, 29 => 5373, 30 => 5374, 31 => 5375, 32 => 5377, ), 221 => array ( 0 => 222, 1 => 263, 2 => 274, 3 => 304, 4 => 308, 5 => 313, 6 => 321, 7 => 334, 8 => 5342, 9 => 5356, 10 => 5362, 11 => 5366, 12 => 5371, ), 359 => array ( 0 => 907, 1 => 931, ), 360 => array ( 0 => 4918, ), 907 => array ( 0 => 908, 1 => 909, 2 => 910, 3 => 911, 4 => 912, 5 => 913, 6 => 914, 7 => 915, 8 => 916, 9 => 917, 10 => 918, 11 => 919, 12 => 920, 13 => 921, 14 => 922, 15 => 923, 16 => 924, 17 => 925, 18 => 926, 19 => 927, 20 => 928, ), 4918 => array ( 0 => 4919, ), 4942 => array ( 0 => 2, 1 => 4943, 2 => 4944, 3 => 4945, 4 => 4946, 5 => 4947, 6 => 4948, 7 => 4949, 8 => 4950, 9 => 4951, 10 => 4952, 11 => 4954, ), 5316 => array ( 0 => 5317, ), 5317 => array ( 0 => 5318, 1 => 5319, 2 => 5322, 3 => 5326, 4 => 5329, 5 => 5333, 6 => 5334, ), 5319 => array ( 0 => 5320, 1 => 5321, ), 5322 => array ( 0 => 5323, 1 => 5324, 2 => 5325, ), 5326 => array ( 0 => 5327, 1 => 5328, ), 5329 => array ( 0 => 5330, 1 => 5331, 2 => 5332, ), 5339 => array ( 0 => 5340, 1 => 5348, 2 => 5353, 3 => 5360, 4 => 5369, ), ), 'webLinkMap' => array ( 5318 => '1', 5319 => '1', 5320 => '12', 5321 => '11', 5322 => '1', 5323 => '157', 5324 => '18', 5325 => '16', 5326 => '1', 5327 => '5', 5328 => '4940', 5329 => '1', 5330 => '17', 5331 => '15', 5332 => '2', 5333 => '202', 5334 => '14', ), 'eventMap' => array ( 'OnBeforeDocFormSave' => array ( 25 => '25', 23 => '23', ), 'OnBeforeEmptyTrash' => array ( 23 => '23', ), 'OnBeforeSaveWebPageCache' => array ( 13 => '13', ), 'OnChunkFormPrerender' => array ( 16 => '16', 14 => '14', ), 'OnChunkFormSave' => array ( 16 => '16', ), 'OnDocFormPrerender' => array ( 34 => '34', 14 => '14', 16 => '16', 25 => '25', 23 => '23', ), 'OnDocFormRender' => array ( 23 => '23', 26 => '26', ), 'OnDocFormSave' => array ( 40 => '40', 25 => '25', 37 => '37', 26 => '26', 16 => '16', 27 => '27', ), 'OnDocPublished' => array ( 3 => '3', 27 => '27', ), 'OnDocUnPublished' => array ( 3 => '3', 27 => '27', ), 'OnEmptyTrash' => array ( 2 => '2', 25 => '25', 37 => '37', ), 'OnFileCreateFormPrerender' => array ( 14 => '14', ), 'OnFileEditFormPrerender' => array ( 14 => '14', ), 'OnHandleRequest' => array ( 15 => '15', 39 => '39', 6 => '6', ), 'OnLoadWebDocument' => array ( 38 => '38', 41 => '41', 25 => '25', 37 => '37', 15 => '15', 26 => '26', ), 'OnMODXInit' => array ( 13 => '13', 38 => '38', ), 'OnPageNotFound' => array ( 1 => '1', 25 => '25', 37 => '37', 3 => '3', ), 'OnPluginFormPrerender' => array ( 16 => '16', 14 => '14', ), 'OnPluginFormSave' => array ( 16 => '16', ), 'OnResourceBeforeSort' => array ( 25 => '25', 23 => '23', ), 'OnResourceDelete' => array ( 27 => '27', ), 'OnResourceDuplicate' => array ( 26 => '26', 25 => '25', 27 => '27', ), 'OnResourceUndelete' => array ( 27 => '27', ), 'OnRichTextBrowserInit' => array ( 33 => '33', ), 'OnRichTextEditorInit' => array ( 33 => '33', ), 'OnRichTextEditorRegister' => array ( 33 => '33', 14 => '14', ), 'OnSiteRefresh' => array ( 13 => '13', 37 => '37', 22 => '22', 31 => '31', ), 'OnSnipFormPrerender' => array ( 16 => '16', 14 => '14', ), 'OnSnipFormSave' => array ( 16 => '16', ), 'OnTempFormPrerender' => array ( 16 => '16', 14 => '14', ), 'OnTempFormSave' => array ( 16 => '16', ), 'OnTVFormPrerender' => array ( 16 => '16', ), 'OnTVFormSave' => array ( 16 => '16', ), 'OnTVInputPropertiesList' => array ( 34 => '34', ), 'OnTVInputRenderList' => array ( 34 => '34', ), 'OnUserFormPrerender' => array ( 12 => '12', 6 => '6', ), 'OnUserFormRender' => array ( 12 => '12', ), 'OnUserFormSave' => array ( 12 => '12', ), 'OnUserRemove' => array ( 12 => '12', ), 'OnUserSave' => array ( 38 => '38', 37 => '37', ), 'OnWebAuthentication' => array ( 6 => '6', ), 'OnWebPageComplete' => array ( 37 => '37', ), 'OnWebPagePrerender' => array ( 28 => '28', 37 => '37', ), ), 'pluginCache' => array ( 1 => array ( 'id' => '1', 'source' => '0', 'property_preprocess' => '0', 'name' => 'ArchivistFurl', 'description' => 'Handles FURLs for Archivist.', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * Archivist * * Copyright 2010-2011 by Shaun McCormick * * This file is part of Archivist, a simple archive navigation system for MODx * Revolution. * * Archivist is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * Archivist is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * Archivist; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * @package archivist */ /** * @var modX $modx * @package archivist */ if ($modx->event->name != \'OnPageNotFound\') return; $archiveIds = $modx->getOption(\'archivist.archive_ids\',null,\'\'); if (empty($archiveIds)) return; $archiveIds = explode(\',\',$archiveIds); /* handle redirects */ $search = $_SERVER[\'REQUEST_URI\']; $base_url = $modx->getOption(\'base_url\'); if ($base_url != \'/\') { $search = str_replace($base_url,\'\',$search); } $search = trim($search, \'/\'); /* get resource to redirect to */ $resourceId = false; $prefix = \'arc_\'; foreach ($archiveIds as $archive) { $archive = explode(\':\',$archive); $archiveId = $archive[0]; $alias = array_search($archiveId,$modx->aliasMap); if ($alias && strpos($search,$alias) !== false) { $search = str_replace($alias,\'\',$search); $resourceId = $archiveId; if (isset($archive[1])) $prefix = $archive[1]; } } if (!$resourceId) return; /* figure out archiving */ $params = explode(\'/\', $search); if (count($params) < 1) return; /* tag handling! */ if ($params[0] == \'tags\') { $_GET[\'tag\'] = $params[1]; } else if ($params[0] == \'user\' || $params[0] == \'author\') { $_GET[$prefix.\'author\'] = $params[1]; } else { /* set Archivist parameters for date-based archives */ $_GET[$prefix.\'year\'] = $params[0]; if (isset($params[1])) $_GET[$prefix.\'month\'] = $params[1]; if (isset($params[2])) $_GET[$prefix.\'day\'] = $params[2]; } /* forward */ $modx->sendForward($resourceId); return;', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 2 => array ( 'id' => '2', 'source' => '0', 'property_preprocess' => '0', 'name' => 'QuipResourceCleaner', 'description' => 'Cleans up threads when a Resource is removed.', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * Quip * * Copyright 2010-11 by Shaun McCormick * * This file is part of Quip, a simple commenting component for MODx Revolution. * * Quip is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * Quip is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Quip; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * * @package quip */ /** * Handles removal of threads if a Resource is deleted. * * @package quip */ $quip = $modx->getService(\'quip\',\'Quip\',$modx->getOption(\'quip.core_path\',null,$modx->getOption(\'core_path\').\'components/quip/\').\'model/quip/\',$scriptProperties); if (!($quip instanceof Quip)) return; switch ($modx->event->name) { case \'OnEmptyTrash\': foreach ($scriptProperties[\'ids\'] as $id) { if (empty($id)) continue; $threads = $modx->getCollection(\'quipThread\',array(\'resource\' => $id)); foreach ($threads as $thread) { $modx->log(modX::LOG_LEVEL_INFO,\'[Quip] Removing thread: \'.$thread->get(\'name\')); $thread->remove(); } } break; } return;', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 3 => array ( 'id' => '3', 'source' => '0', 'property_preprocess' => '0', 'name' => 'ArticlesPlugin', 'description' => 'Handles FURLs for Articles.', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * Articles * * Copyright 2011-12 by Shaun McCormick * * Articles is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * Articles is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Articles; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * @package articles */ /** * @var modX $modx * @var array $scriptProperties */ switch ($modx->event->name) { case \'OnManagerPageInit\': $cssFile = $modx->getOption(\'articles.assets_url\',null,$modx->getOption(\'assets_url\').\'components/articles/\').\'css/mgr.css\'; $modx->regClientCSS($cssFile); break; case \'OnPageNotFound\': $corePath = $modx->getOption(\'articles.core_path\',null,$modx->getOption(\'core_path\').\'components/articles/\'); require_once $corePath.\'model/articles/articlesrouter.class.php\'; $router = new ArticlesRouter($modx); $router->route(); return; case \'OnDocPublished\': /** @var Article $resource */ $resource =& $scriptProperties[\'resource\']; if ($resource instanceof Article) { $resource->setArchiveUri(); $resource->save(); $modx->cacheManager->refresh(array( \'db\' => array(), \'auto_publish\' => array(\'contexts\' => array($resource->get(\'context_key\'))), \'context_settings\' => array(\'contexts\' => array($resource->get(\'context_key\'))), \'resource\' => array(\'contexts\' => array($resource->get(\'context_key\'))), )); $resource->notifyUpdateServices(); $resource->sendNotifications(); } break; case \'OnDocUnPublished\': $resource =& $scriptProperties[\'resource\']; break; } return;', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 22 => array ( 'id' => '22', 'source' => '0', 'property_preprocess' => '0', 'name' => 'phpThumbOfCacheManager', 'description' => 'Handles cache cleaning when clearing the Site Cache.', 'editor_type' => '0', 'category' => '29', 'cache_type' => '0', 'plugincode' => '/* * Handles cache cleanup * pThumb * Copyright 2013 Jason Grant * * Please see the GitHub page for documentation or to report bugs: * https://github.com/oo12/phpThumbOf * * pThumb is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) any * later version. * * pThumb is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * phpThumbOf; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ if ($modx->event->name === \'OnSiteRefresh\') { if (!$modx->loadClass(\'pThumbCacheCleaner\', MODX_CORE_PATH . \'components/phpthumbof/model/\', true, true)) { $modx->log(modX::LOG_LEVEL_ERROR, \'[pThumb] Could not load pThumbCacheCleaner class.\'); return; } static $pt_settings = array(); $pThumb = new pThumbCacheCleaner($modx, $pt_settings, array(), true); $pThumb->cleanCache(); }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 6 => array ( 'id' => '6', 'source' => '1', 'property_preprocess' => '0', 'name' => 'HybridAuth', 'description' => '', 'editor_type' => '0', 'category' => '10', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnHandleRequest\': if ($modx->context->key != \'web\' && !$modx->user->id) { if ($user = $modx->getAuthenticatedUser($modx->context->key)) { $modx->user = $user; $modx->getUser($modx->context->key); } } if ($modx->user->isAuthenticated($modx->context->key)) { if (!$modx->user->active || $modx->user->Profile->blocked) { $modx->runProcessor(\'security/logout\'); $modx->sendRedirect($modx->makeUrl($modx->getOption(\'site_start\'), \'\', \'\', \'full\')); } } if (!empty($_REQUEST[\'hauth_action\']) || !empty($_REQUEST[\'hauth_start\']) || !empty($_REQUEST[\'hauth_done\'])) { $config = !empty($_SESSION[\'HybridAuth\'][$modx->context->key]) ? $_SESSION[\'HybridAuth\'][$modx->context->key] : array(); $path = MODX_CORE_PATH . \'components/hybridauth/model/hybridauth/\'; /** @var HybridAuth $HybridAuth */ if ($HybridAuth = $modx->getService(\'HybridAuth\', \'HybridAuth\', $path, $config)) { if (!empty($_REQUEST[\'hauth_action\'])) { switch ($_REQUEST[\'hauth_action\']) { case \'login\': $HybridAuth->Login(@$_REQUEST[\'provider\']); break; case \'logout\': $HybridAuth->Logout(); break; case \'unbind\': $HybridAuth->runProcessor(\'web/service/remove\', array( \'provider\' => @$_REQUEST[\'provider\'], )); $HybridAuth->Refresh(); break; } } else { $HybridAuth->processAuth(); } } } break; case \'OnWebAuthentication\': $modx->event->_output = !empty($_SESSION[\'HybridAuth\'][\'verified\']); unset($_SESSION[\'HybridAuth\'][\'verified\']); break; case \'OnUserFormPrerender\': /** @var modUser $user */ if (!isset($user) || $user->get(\'id\') < 1) { return; } $path = MODX_CORE_PATH . \'components/hybridauth/model/hybridauth/\'; if ($HybridAuth = $modx->getService(\'HybridAuth\', \'HybridAuth\', $path)) { $HybridAuth->regManagerTab($modx->controller, $user); } break; }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => 'core/components/hybridauth/elements/plugins/plugin.hybridauth.php', ), 12 => array ( 'id' => '12', 'source' => '0', 'property_preprocess' => '0', 'name' => 'ExtraUserFields', 'description' => 'Add and process extra fields in Create/Edit User form', 'editor_type' => '0', 'category' => '13', 'cache_type' => '0', 'plugincode' => '/** * ExtraUserFields plugin for ClassExtender extra * * Copyright 2012-2014 by Bob Ray * Created on 12-10-2013 * * ClassExtender is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * ClassExtender is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * ClassExtender; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * @package classextender */ /** * Description * ----------- * Add and process extra fields in Create/Edit User form * * Variables * --------- * * @var $modx modX * @var $scriptProperties array * * @package classextender * * Events: OnUserFormPrerender, OnUserFormRender, OnUserFormSave * **/ /* Define extra fields */ $fields = array(); /* Make sure we have an extUser object to work with */ if (isset($user) && ($user instanceof modUser)) { $data = $modx->getObject(\'userData\', array(\'userdata_id\' => $user->get(\'id\'))); } /* @var $data userData */ /* Create related object if it doesn\'t exist */ if (!$data) { $data = $modx->newObject(\'userData\'); } if ($data) { $fields = $data->toArray(); } switch ($modx->event->name) { case \'OnUserFormPrerender\': /* if you want to add custom scripts, css, etc, register them here */ break; case \'OnUserFormRender\': if ($data) { /* Set fields with values from DB (if any) */ foreach ($fields as $key => $value) { $dbValue = $data->get($key); /* Make sure there are no null values */ $dbValue = $dbValue === null? \'\' : $dbValue; $fields[$key] = $dbValue; } } /* Now do the HTML */ $extraFields = $modx->getChunk(\'MyExtraUserFields\', $fields); /* Add our custom fields to the Create/Edit User form */ $modx->event->output($extraFields); break; case \'OnUserFormSave\': /* do processing logic here. */ /* @var $user extUser */ if (!$data) { $modx->log(modX::LOG_LEVEL_ERROR, \'[ExtraUserFields] No Data object\'); return; } if (!$user) { $modx->log(modX::LOG_LEVEL_ERROR, \'[ExtraUserFields] No User object\'); return; } $data->set(\'userdata_id\', $user->get(\'id\')); $fields = array_keys($fields); $postKeys = array_keys($_POST); $dirty = false; foreach($fields as $field) { if ($field === \'id\') { continue; } if (in_array($field, $postKeys)) { /* Convert NULL to \'\', but preserve \'0\' */ if (empty($_POST[$field]) && ($_POST[$field] !== \'0\')) { $_POST[$field] = \'\'; } /* If $_POST values don\'t match DB value, update field and set dirty flag */ if ($_POST[$field] !== $data->get($field)) { $data->set($field, $_POST[$field]); $dirty = true; } } } /* Set registration date to today - delete if not needed */ $rDate = $data->get(\'registrationDate\'); if (empty($rDate)) { $dirty = true; $data->set(\'registrationDate\', strtotime(date(\'Y-m-d\'))); } /* End of registration date section */ /* Save the data, if necessary */ if ($dirty) { $data->save(); } break; case \'OnUserRemove\': $extData = $modx->getObject(\'userData\', array(\'userdata_id\' => $user->get(\'id\'))); if ($extData) { $extData->remove(); } break; } return \'\';', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 13 => array ( 'id' => '13', 'source' => '1', 'property_preprocess' => '0', 'name' => 'pdoTools', 'description' => '', 'editor_type' => '0', 'category' => '15', 'cache_type' => '0', 'plugincode' => '/** @var modX $modx */ switch ($modx->event->name) { case \'OnMODXInit\': $fqn = $modx->getOption(\'pdoTools.class\', null, \'pdotools.pdotools\', true); $path = $modx->getOption(\'pdotools_class_path\', null, MODX_CORE_PATH . \'components/pdotools/model/\', true); $modx->loadClass($fqn, $path, false, true); $fqn = $modx->getOption(\'pdoFetch.class\', null, \'pdotools.pdofetch\', true); $path = $modx->getOption(\'pdofetch_class_path\', null, MODX_CORE_PATH . \'components/pdotools/model/\', true); $modx->loadClass($fqn, $path, false, true); break; case \'OnBeforeSaveWebPageCache\': if (!empty($modx->config[\'fenom_jscripts\'])) { foreach ($modx->config[\'fenom_jscripts\'] as $key => $value) { unset($modx->resource->_jscripts[$key]); } $modx->resource->_jscripts = array_values($modx->resource->_jscripts); } if (!empty($modx->config[\'fenom_sjscripts\'])) { foreach ($modx->config[\'fenom_sjscripts\'] as $key => $value) { unset($modx->resource->_sjscripts[$key]); } $modx->resource->_sjscripts = array_values($modx->resource->_sjscripts); } if (!empty($modx->config[\'fenom_loadedscripts\'])) { foreach ($modx->config[\'fenom_loadedscripts\'] as $key => $value) { unset($modx->resource->_loadedjscripts[$key]); } } break; case \'OnSiteRefresh\': /** @var pdoTools $pdoTools */ if ($pdoTools = $modx->getService(\'pdoTools\')) { if ($pdoTools->clearFileCache()) { $modx->log(modX::LOG_LEVEL_INFO, $modx->lexicon(\'refresh_default\') . \': pdoTools\'); } } break; }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => 'core/components/pdotools/elements/plugins/plugin.pdotools.php', ), 14 => array ( 'id' => '14', 'source' => '0', 'property_preprocess' => '0', 'name' => 'Ace', 'description' => 'Ace code editor plugin for MODx Revolution', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * Ace Source Editor Plugin * * Events: OnManagerPageBeforeRender, OnRichTextEditorRegister, OnSnipFormPrerender, * OnTempFormPrerender, OnChunkFormPrerender, OnPluginFormPrerender, * OnFileCreateFormPrerender, OnFileEditFormPrerender, OnDocFormPrerender * * @author Danil Kostin * * @package ace * * @var array $scriptProperties * @var Ace $ace */ if ($modx->event->name == \'OnRichTextEditorRegister\') { $modx->event->output(\'Ace\'); return; } if ($modx->getOption(\'which_element_editor\', null, \'Ace\') !== \'Ace\') { return; } $ace = $modx->getService(\'ace\', \'Ace\', $modx->getOption(\'ace.core_path\', null, $modx->getOption(\'core_path\').\'components/ace/\').\'model/ace/\'); $ace->initialize(); $extensionMap = array( \'tpl\' => \'text/x-smarty\', \'htm\' => \'text/html\', \'html\' => \'text/html\', \'css\' => \'text/css\', \'scss\' => \'text/x-scss\', \'less\' => \'text/x-less\', \'svg\' => \'image/svg+xml\', \'xml\' => \'application/xml\', \'xsl\' => \'application/xml\', \'js\' => \'application/javascript\', \'json\' => \'application/json\', \'php\' => \'application/x-php\', \'sql\' => \'text/x-sql\', \'md\' => \'text/x-markdown\', \'txt\' => \'text/plain\', \'twig\' => \'text/x-twig\' ); // Defines wether we should highlight modx tags $modxTags = false; switch ($modx->event->name) { case \'OnSnipFormPrerender\': $field = \'modx-snippet-snippet\'; $mimeType = \'application/x-php\'; break; case \'OnTempFormPrerender\': $field = \'modx-template-content\'; $modxTags = true; switch (true) { case $modx->getOption(\'twiggy_class\'): $mimeType = \'text/x-twig\'; break; case $modx->getOption(\'pdotools_fenom_parser\'): $mimeType = \'text/x-smarty\'; break; default: $mimeType = \'text/html\'; break; } break; case \'OnChunkFormPrerender\': $field = \'modx-chunk-snippet\'; if ($modx->controller->chunk && $modx->controller->chunk->isStatic()) { $extension = pathinfo($modx->controller->chunk->getSourceFile(), PATHINFO_EXTENSION); $mimeType = isset($extensionMap[$extension]) ? $extensionMap[$extension] : \'text/plain\'; } else { $mimeType = \'text/html\'; } $modxTags = true; switch (true) { case $modx->getOption(\'twiggy_class\'): $mimeType = \'text/x-twig\'; break; case $modx->getOption(\'pdotools_fenom_default\'): $mimeType = \'text/x-smarty\'; break; default: $mimeType = \'text/html\'; break; } break; case \'OnPluginFormPrerender\': $field = \'modx-plugin-plugincode\'; $mimeType = \'application/x-php\'; break; case \'OnFileCreateFormPrerender\': $field = \'modx-file-content\'; $mimeType = \'text/plain\'; break; case \'OnFileEditFormPrerender\': $field = \'modx-file-content\'; $extension = pathinfo($scriptProperties[\'file\'], PATHINFO_EXTENSION); $mimeType = isset($extensionMap[$extension]) ? $extensionMap[$extension] : \'text/plain\'; $modxTags = $extension == \'tpl\'; break; case \'OnDocFormPrerender\': if (!$modx->controller->resourceArray) { return; } $field = \'ta\'; $mimeType = $modx->getObject(\'modContentType\', $modx->controller->resourceArray[\'content_type\'])->get(\'mime_type\'); switch (true) { case $mimeType == \'text/html\' && $modx->getOption(\'twiggy_class\'): $mimeType = \'text/x-twig\'; break; case $mimeType == \'text/html\' && $modx->getOption(\'pdotools_fenom_parser\'): $mimeType = \'text/x-smarty\'; break; } if ($modx->getOption(\'use_editor\')){ $richText = $modx->controller->resourceArray[\'richtext\']; $classKey = $modx->controller->resourceArray[\'class_key\']; if ($richText || in_array($classKey, array(\'modStaticResource\',\'modSymLink\',\'modWebLink\',\'modXMLRPCResource\'))) { $field = false; } } $modxTags = true; break; default: return; } $modxTags = (int) $modxTags; $script = \'\'; if ($field) { $script .= "MODx.ux.Ace.replaceComponent(\'$field\', \'$mimeType\', $modxTags);"; } if ($modx->event->name == \'OnDocFormPrerender\' && !$modx->getOption(\'use_editor\')) { $script .= "MODx.ux.Ace.replaceTextAreas(Ext.query(\'.modx-richtext\'));"; } if ($script) { $modx->controller->addHtml(\'\'); }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => 'ace/elements/plugins/ace.plugin.php', ), 15 => array ( 'id' => '15', 'source' => '1', 'property_preprocess' => '0', 'name' => 'mealPlanner', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnHandleRequest\': case \'OnLoadWebDocument\': $isAjax = !empty($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && $_SERVER[\'HTTP_X_REQUESTED_WITH\'] == \'XMLHttpRequest\'; if ($modx->user->hasSessionContext(\'web\') && !empty($_SESSION[\'mealCalendar\'])) { if (!$mealPlanner = $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'mealplanner_core_path\', null, $modx->getOption(\'core_path\') . \'components/mealplanner/\') . \'model/mealplanner/\', $scriptProperties)) { @session_write_close(); exit(\'Could not load mealPlanner class!\'); } $data = array_merge(array(\'user_id\' => $modx->user->get(\'id\')), $modx->fromJSON($_SESSION[\'mealCalendar\'])); $response = $modx->runProcessor(\'mgr/calendar/create\',$data,array(\'processors_path\' => MODX_CORE_PATH.\'components/mealplanner/processors/\')); unset($_SESSION[\'mealCalendar\']); } if (empty($_REQUEST[\'action\']) || ($isAjax && $modx->event->name != \'OnHandleRequest\') || (!$isAjax && $modx->event->name != \'OnLoadWebDocument\')) {return;} $action = trim($_REQUEST[\'action\']); $ctx = !empty($_REQUEST[\'ctx\']) ? (string) $_REQUEST[\'ctx\'] : \'web\'; if ($ctx != \'web\') {$modx->switchContext($ctx);} /** @var mealPlanner $mealPlanner */ if (!$mealPlanner = $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'mealplanner_core_path\', null, $modx->getOption(\'core_path\') . \'components/mealplanner/\') . \'model/mealplanner/\', $scriptProperties)) { @session_write_close(); exit(\'Could not load mealPlanner class!\'); } switch ($action) { case \'saveMealPlan\': $data = filter_input(INPUT_POST,\'data\'); if (!$modx->user->hasSessionContext(\'web\')) { $_SESSION[\'mealCalendar\'] = $data; $response = $modx->toJSON([\'redirect\' => $modx->makeUrl(37)]); } else { $data = array_merge(array(\'user_id\' => $modx->user->get(\'id\')), $modx->fromJSON($data)); $response = $modx->runProcessor(\'mgr/calendar/create\',$data,array(\'processors_path\' => MODX_CORE_PATH.\'components/mealplanner/processors/\')); $response = $modx->toJSON($response->response); } if ($isAjax) { @session_write_close(); exit($response); } break; default: $message = ($_REQUEST[\'action\'] != $action) ? \'mealplanner_err_register_globals\' : \'mealplanner_err_unknown\'; $response = $mealPlanner->error($message); } break; }', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 16 => array ( 'id' => '16', 'source' => '0', 'property_preprocess' => '0', 'name' => 'VersionX', 'description' => 'The plugin that enables VersionX of tracking your content.', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '$corePath = $modx->getOption(\'versionx.core_path\',null,$modx->getOption(\'core_path\').\'components/versionx/\'); require_once $corePath.\'model/versionx.class.php\'; $modx->versionx = new VersionX($modx); include $corePath . \'elements/plugins/versionx.plugin.php\'; return;', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 23 => array ( 'id' => '23', 'source' => '0', 'property_preprocess' => '0', 'name' => 'Collections', 'description' => '', 'editor_type' => '0', 'category' => '30', 'cache_type' => '0', 'plugincode' => '/** * Collections * * DESCRIPTION * * This plugin inject JS to handle proper working of close buttons in Resource\'s panel (OnDocFormPrerender) * This plugin handles setting proper show_in_tree parameter (OnBeforeDocFormSave, OnResourceSort) * * @var modX $modx * @var array $scriptProperties */ $corePath = $modx->getOption(\'collections.core_path\', null, $modx->getOption(\'core_path\', null, MODX_CORE_PATH) . \'components/collections/\'); /** @var Collections $collections */ $collections = $modx->getService( \'collections\', \'Collections\', $corePath . \'model/collections/\', array( \'core_path\' => $corePath ) ); $className = \'Collections\' . $modx->event->name; $modx->loadClass(\'CollectionsPlugin\', $collections->getOption(\'modelPath\') . \'collections/events/\', true, true); $modx->loadClass($className, $collections->getOption(\'modelPath\') . \'collections/events/\', true, true); if (class_exists($className)) { /** @var CollectionsPlugin $handler */ $handler = new $className($modx, $scriptProperties); $handler->run(); } return;', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 25 => array ( 'id' => '25', 'source' => '0', 'property_preprocess' => '0', 'name' => 'StercSEO', 'description' => 'Plugin to render SEO Tab and save all the data.', 'editor_type' => '0', 'category' => '37', 'cache_type' => '0', 'plugincode' => '/** * SEO Tab * * Copyright 2013 by Sterc internet & marketing * * This file is part of SEO Tab. * * SEO Tab is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * SEO Tab is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * SEO Tab; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * * @package stercseo */ /** * SEO Tab Plugin * * * Events: * OnDocFormPrerender,OnDocFormSave,OnHandleRequest,OnPageNotFound, OnResourceDuplicate, OnEmptyThrash, OnResourceBeforeSort * * @author Sterc internet & marketing * * @package stercseo * */ $stercseo = $modx->getService(\'stercseo\', \'StercSEO\', $modx->getOption(\'stercseo.core_path\', null, $modx->getOption(\'core_path\').\'components/stercseo/\').\'model/stercseo/\', array()); if (!($stercseo instanceof StercSEO)) { return; } switch ($modx->event->name) { case \'OnDocFormPrerender\': if (!$stercseo->checkUserAccess()) { return; } $resource =& $modx->event->params[\'resource\']; if ($resource) { //First check if SEO Tab is allowed in this context if (!$stercseo->isAllowed($resource->get(\'context_key\'))) { return; } $properties = $resource->getProperties(\'stercseo\'); $urls = $modx->getCollection(\'seoUrl\', array(\'resource\' => $resource->get(\'id\'))); } if (empty($properties)) { $properties = array( \'index\' => $modx->getOption(\'stercseo.index\', null, \'1\'), \'follow\' => $modx->getOption(\'stercseo.follow\', null, \'1\'), \'sitemap\' => $modx->getOption(\'stercseo.sitemap\', null, \'1\'), \'priority\' => $modx->getOption(\'stercseo.priority\', null, \'0.5\'), \'changefreq\' => $modx->getOption(\'stercseo.changefreq\', null, \'weekly\') ); } $properties[\'urls\'] = \'\'; // Fetch urls from seoUrl collection if ($urls && is_object($urls)) { foreach ($urls as $url) { $properties[\'urls\'][][\'url\'] = urldecode($url->get(\'url\')); } } $modx->regClientStartupHTMLBlock(\'\'); $version = $modx->getVersionData(); /* include CSS and JS*/ if ($version[\'version\'] == 2 && $version[\'major_version\'] == 2) { $modx->regClientCSS($stercseo->config[\'cssUrl\'].\'stercseo.css\'); } $modx->regClientStartupScript($stercseo->config[\'jsUrl\'].\'mgr/stercseo.js\'); $modx->regClientStartupScript($stercseo->config[\'jsUrl\'].\'mgr/sections/resource.js\'); $modx->regClientStartupScript($stercseo->config[\'jsUrl\'].\'mgr/widgets/resource.grid.js\'); $modx->regClientStartupScript($stercseo->config[\'jsUrl\'].\'mgr/widgets/resource.vtabs.js\'); //add lexicon $modx->controller->addLexiconTopic(\'stercseo:default\'); break; case \'OnBeforeDocFormSave\': $oldResource = ($mode == \'upd\') ? $modx->getObject(\'modResource\', $resource->get(\'id\')) : $resource; if (!$stercseo->isAllowed($oldResource->get(\'context_key\'))) { return; } $properties = $oldResource->getProperties(\'stercseo\'); if (isset($_POST[\'urls\'])) { $urls = $modx->fromJSON($_POST[\'urls\']); foreach ($urls as $url) { $check = $modx->getObject(\'seoUrl\', array( \'url\' => urlencode($url[\'url\']), \'resource\' => $oldResource->get(\'id\'), \'context_key\' => $oldResource->get(\'context_key\'))); if (!$check) { $redirect = $modx->newObject(\'seoUrl\'); $data = array( \'url\' => urlencode($url[\'url\']), \'resource\' => $oldResource->get(\'id\'), \'context_key\' => $oldResource->get(\'context_key\'), ); $redirect->fromArray($data); $redirect->save(); } } } if ($mode == \'upd\') { $newProperties = array( \'index\' => (isset($_POST[\'index\']) ? $_POST[\'index\'] : $properties[\'index\']), \'follow\' => (isset($_POST[\'follow\']) ? $_POST[\'follow\'] : $properties[\'follow\']), \'sitemap\' => (isset($_POST[\'sitemap\']) ? $_POST[\'sitemap\'] : $properties[\'sitemap\']), \'priority\' => (isset($_POST[\'priority\']) ? $_POST[\'priority\'] : $properties[\'priority\']), \'changefreq\' => (isset($_POST[\'changefreq\']) ? $_POST[\'changefreq\'] : $properties[\'changefreq\']) ); } else { $newProperties = array( \'index\' => (isset($_POST[\'index\']) ? $_POST[\'index\'] : $modx->getOption(\'stercseo.index\', null, \'1\')), \'follow\' => (isset($_POST[\'follow\']) ? $_POST[\'follow\'] : $modx->getOption(\'stercseo.follow\', null, \'1\')), \'sitemap\' => (isset($_POST[\'sitemap\']) ? $_POST[\'sitemap\'] : $modx->getOption(\'stercseo.sitemap\', null, \'1\')), \'priority\' => (isset($_POST[\'priority\']) ? $_POST[\'priority\'] : $modx->getOption(\'stercseo.priority\', null, \'0.5\')), \'changefreq\' => (isset($_POST[\'changefreq\']) ? $_POST[\'changefreq\'] : $modx->getOption(\'stercseo.changefreq\', null, \'weekly\')) ); } // If uri is changed or alias (with freeze uri off) has changed, add a new redirect if (($oldResource->get(\'uri\') != $resource->get(\'uri\') || ($oldResource->get(\'uri_override\') == 0 && $oldResource->get(\'alias\') != $resource->get(\'alias\'))) && $oldResource->get(\'uri\') != \'\') { $url = urlencode($modx->getOption(\'site_url\').$oldResource->get(\'uri\')); if (!$modx->getCount(\'seoUrl\', array(\'url\' => $url))) { $data = array( \'url\' => $url, \'resource\' => $resource->get(\'id\'), \'context_key\' => $resource->get(\'context_key\'), ); $redirect = $modx->newObject(\'seoUrl\'); $redirect->fromArray($data); $redirect->save(); } // Recursive set all children resources as redirects if ($modx->getOption(\'use_alias_path\')) { $resourceOldBasePath = $oldResource->getAliasPath($oldResource->get(\'alias\'), $oldResource->toArray() + array(\'isfolder\' => 1)); $resourceNewBasePath = $resource->getAliasPath($resource->get(\'alias\'), $resource->toArray() + array(\'isfolder\' => 1)); $childResources = $modx->getIterator(\'modResource\', array( \'uri:LIKE\' => $resourceOldBasePath . \'%\', \'uri_override\' => \'0\', \'published\' => \'1\', \'deleted\' => \'0\', \'context_key\' => $resource->get(\'context_key\') )); foreach ($childResources as $childResource) { $url = urlencode($modx->getOption(\'site_url\').$childResource->get(\'uri\')); if (!$modx->getCount(\'seoUrl\', array(\'url\' => $url))) { $data = array( \'url\' => $url, \'resource\' => $childResource->get(\'id\'), \'context_key\' => $resource->get(\'context_key\'), ); $redirect = $modx->newObject(\'seoUrl\'); $redirect->fromArray($data); $redirect->save(); } } } } $resource->setProperties($newProperties, \'stercseo\'); break; case \'OnDocFormSave\': if (!$stercseo->isAllowed($resource->context_key)) { return; } $url = urlencode($modx->makeUrl($resource->id, $resource->context_key, \'\', \'full\')); $urlExists = $modx->getObject(\'seoUrl\', array( \'url\' => $url, \'context_key\' => $resource->context_key )); if ($urlExists) { $modx->removeObject(\'seoUrl\', array( \'url\' => $url, \'context_key\' => $resource->context_key )); } break; case \'OnLoadWebDocument\': if ($modx->resource) { if (!$stercseo->isAllowed($modx->resource->get(\'context_key\'))) { return; } $properties = $modx->resource->getProperties(\'stercseo\'); if (empty($properties)) { // Properties not available // This means an this resource has nog SEO Tab properties, which means it is a pre-SEO Tab resource // Fallback to system defaults $properties = array( \'index\' => $modx->getOption(\'stercseo.index\', null, 1), \'follow\' => $modx->getOption(\'stercseo.follow\', null, 1) ); } $metaContent = array(\'noodp\', \'noydir\'); $metaContent[] = (intval($properties[\'index\']) ? \'index\' : \'noindex\'); $metaContent[] = (intval($properties[\'follow\']) ? \'follow\' : \'nofollow\'); $modx->setPlaceholder(\'seoTab.robotsTag\', implode(\',\', $metaContent)); } break; case \'OnPageNotFound\': $options = array(); $url = $modx->getOption(\'server_protocol\').\'://\'.$_SERVER[\'HTTP_HOST\'].$_SERVER[\'REQUEST_URI\']; $convertedUrl = urlencode($url); $w = array( \'url\' => $convertedUrl ); if ($modx->getOption(\'stercseo.context-aware-alias\', null, \'0\')) { $w[\'context_key\'] = $modx->context->key; } $alreadyExists = $modx->getObject(\'seoUrl\', $w); if (isset($alreadyExists) && ($modx->context->key !== $alreadyExists->get(\'context_key\'))) { $q = $modx->newQuery(\'modContextSetting\'); $q->where(array( \'context_key\' => $alreadyExists->get(\'context_key\'), \'key\' => \'site_url\' )); $q->prepare(); $siteUrl = $modx->getObject(\'modContextSetting\', $q); if ($siteUrl) { $options[\'site_url\'] = $siteUrl->get(\'value\'); } } if ($alreadyExists) { $url = $modx->makeUrl($alreadyExists->get(\'resource\'), $alreadyExists->get(\'context_key\'), \'\', \'full\', $options); $modx->sendRedirect($url, 0, \'REDIRECT_HEADER\', \'HTTP/1.1 301 Moved Permanently\'); } break; case \'OnResourceBeforeSort\': list($sourceCtx, $resource) = explode(\'_\', $modx->getOption(\'source\', $_POST)); list($targetCtx, $target) = explode(\'_\', $modx->getOption(\'target\', $_POST)); switch ($modx->getOption(\'point\', $_POST)) { case \'above\': case \'below\': $tmpRes = $modx->getObject(\'modResource\', $target); $target = $tmpRes->get(\'parent\'); unset($tmpRes); break; } $oldResource = $modx->getObject(\'modResource\', $resource); $resource = $modx->getObject(\'modResource\', $resource); $resource->set(\'parent\', $target); $resource->set(\'uri\', \'\'); $uriChanged = false; if ($oldResource->get(\'uri\') != $resource->get(\'uri\') && $oldResource->get(\'uri\') != \'\') { $uriChanged = true; } // Recursive set redirects for drag/dropped resource, and its children (where uri_override is not set) if ($uriChanged && $modx->getOption(\'use_alias_path\')) { $oldResource->set(\'isfolder\', true); $resourceOldBasePath = $oldResource->getAliasPath( $oldResource->get(\'alias\'), $oldResource->toArray() ); $resourceNewBasePath = $resource->getAliasPath( $resource->get(\'alias\'), $resource->toArray() + array(\'isfolder\' => 1) ); $cond = $modx->newQuery(\'modResource\'); $cond->where(array( array( \'uri:LIKE\' => $resourceOldBasePath . \'%\', \'OR:id:=\' => $oldResource->id ), \'uri_override\' => \'0\', \'published\' => \'1\', \'deleted\' => \'0\', \'context_key\' => $resource->get(\'context_key\') )); $childResources = $modx->getIterator(\'modResource\', $cond); foreach ($childResources as $childResource) { $url = urlencode($modx->getOption(\'site_url\').$childResource->get(\'uri\')); if (!$modx->getCount(\'seoUrl\', array(\'url\' => $url))) { $data = array( \'url\' => $url, \'resource\' => $childResource->get(\'id\'), \'context_key\' => $targetCtx ); $redirect = $modx->newObject(\'seoUrl\'); $redirect->fromArray($data); $redirect->save(); } } } break; case \'OnResourceDuplicate\': if (!$stercseo->isAllowed($newResource->get(\'context_key\'))) { return; } $props = $newResource->getProperties(\'stercseo\'); $newResource->setProperties($props, \'stercseo\'); $newResource->save(); break; case \'OnManagerPageBeforeRender\': if (!$stercseo->checkUserAccess()) { return; } // If migration status is false, show migrate alert message bar in manager if (!$stercseo->redirectMigrationStatus()) { $modx->regClientStartupHTMLBlock($stercseo->getChunk(\'migrate/alert\', array(\'message\' => $modx->lexicon(\'stercseo.migrate_alert\')))); $modx->regClientCSS($stercseo->config[\'cssUrl\'].\'migrate.css\'); } break; case \'OnEmptyTrash\': if (count($ids) > 0) { foreach ($ids as $id) { $modx->removeCollection(\'seoUrl\', array( \'resource\' => $id )); } } } return;', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 26 => array ( 'id' => '26', 'source' => '0', 'property_preprocess' => '0', 'name' => 'seoPro', 'description' => 'seoPro 1.0.4-pl . SEO optimizing plugin for MODx Revolution', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * The base seoPro snippet. * * @package seopro */ $seoPro = $modx->getService(\'seopro\', \'seoPro\', $modx->getOption(\'seopro.core_path\', null, $modx->getOption(\'core_path\') . \'components/seopro/\') . \'model/seopro/\', $scriptProperties); if (!($seoPro instanceof seoPro)) return \'\'; $disabledTemplates = explode(\',\', $modx->getOption(\'seopro.disabledtemplates\', null, \'0\')); switch ($modx->event->name) { case \'OnDocFormRender\': $template = ($resource->get(\'template\')) ? (string)$resource->get(\'template\') : (string)$_REQUEST[\'template\']; if (in_array($template, $disabledTemplates)) { break; } $currClassKey = $resource->get(\'class_key\'); $strFields = $modx->getOption(\'seopro.fields\', null, \'pagetitle:70,longtitle:70,description:155,alias:2023,menutitle:2023\'); $arrFields = array(); if (is_array(explode(\',\', $strFields))) { foreach (explode(\',\', $strFields) as $field) { list($fieldName, $fieldCount) = explode(\':\', $field); $arrFields[$fieldName] = $fieldCount; } } else { return \'\'; } $keywords = \'\'; $modx->controller->addLexiconTopic(\'seopro:default\'); if ($mode == \'upd\') { $url = $modx->makeUrl($resource->get(\'id\'), \'\', \'\', \'full\'); $url = str_replace($resource->get(\'alias\'), \'\' . $resource->get(\'alias\') . \'\', $url); $seoKeywords = $modx->getObject(\'seoKeywords\', array(\'resource\' => $resource->get(\'id\'))); if ($seoKeywords) { $keywords = $seoKeywords->get(\'keywords\'); } } else { if ($_REQUEST[\'id\']) { $url = $modx->makeUrl($_REQUEST[\'id\'], \'\', \'\', \'full\'); $url .= \'/\'; } else { $url = $modx->getOption(\'site_url\') . \'\'; } } if ($_REQUEST[\'id\'] == $modx->getOption(\'site_start\')) { unset($arrFields[\'alias\']); unset($arrFields[\'menutitle\']); } $config = $seoPro->config; unset($config[\'resource\']); $modx->regClientStartupHTMLBlock(\'\'); /* include CSS and JS*/ $version = $modx->getVersionData(); if($version[\'version\'] == 2 && $version[\'major_version\'] == 2){ $modx->regClientCSS($seoPro->config[\'assetsUrl\'] . \'css/mgr.css\'); }else{ $modx->regClientCSS($seoPro->config[\'assetsUrl\'] . \'css/mgr23.css\'); } $modx->regClientStartupScript($seoPro->config[\'assetsUrl\'] . \'js/mgr/seopro.js??v=\' . $modx->getOption(\'seopro.version\', null, \'v1.0.0\')); $modx->regClientStartupScript($seoPro->config[\'assetsUrl\'] . \'js/mgr/resource.js?v=\' . $modx->getOption(\'seopro.version\', null, \'v1.0.0\')); break; case \'OnDocFormSave\': $template = ($resource->get(\'template\')) ? (string)$resource->get(\'template\') : (string)$_REQUEST[\'template\']; if (in_array($template, $disabledTemplates)) { break; } $seoKeywords = $modx->getObject(\'seoKeywords\', array(\'resource\' => $resource->get(\'id\'))); if (!$seoKeywords && isset($resource)) { $seoKeywords = $modx->newObject(\'seoKeywords\', array(\'resource\' => $resource->get(\'id\'))); } if($seoKeywords){ $seoKeywords->set(\'keywords\', trim($_POST[\'keywords\'], \',\')); $seoKeywords->save(); } break; case \'onResourceDuplicate\': $template = ($resource->get(\'template\')) ? (string)$resource->get(\'template\') : (string)$_REQUEST[\'template\']; if (in_array($template, $disabledTemplates)) { break; } $seoKeywords = $modx->getObject(\'seoKeywords\', array(\'resource\' => $resource->get(\'id\'))); if (!$seoKeywords) { $seoKeywords = $modx->newObject(\'seoKeywords\', array(\'resource\' => $resource->get(\'id\'))); } $newSeoKeywords = $modx->newObject(\'seoKeywords\'); $newSeoKeywords->fromArray($seoKeywords->toArray()); $newSeoKeywords->set(\'resource\', $newResource->get(\'id\')); $newSeoKeywords->save(); break; case \'OnLoadWebDocument\': if ($modx->context->get(\'key\') == "mgr") { break; } $template = ($modx->resource->get(\'template\')) ? (string)$modx->resource->get(\'template\') : (string)$_REQUEST[\'template\']; if (in_array($template, $disabledTemplates)) { break; } $seoKeywords = $modx->getObject(\'seoKeywords\', array(\'resource\' => $modx->resource->get(\'id\'))); if ($seoKeywords) { $keyWords = $seoKeywords->get(\'keywords\'); $modx->setPlaceholder(\'seoPro.keywords\', $keyWords); } $siteBranding = (boolean) $modx->getOption(\'seopro.allowbranding\', null, true); $siteDelimiter = $modx->getOption(\'seopro.delimiter\', null, \'/\'); $siteUseSitename = (boolean) $modx->getOption(\'seopro.usesitename\', null, true); $siteID = $modx->resource->get(\'id\'); $siteName = $modx->getOption(\'site_name\'); $longtitle = $modx->resource->get(\'longtitle\'); $pagetitle = $modx->resource->get(\'pagetitle\'); $seoProTitle = array(); if ($siteID == $modx->getOption(\'site_start\')) { $seoProTitle[\'pagetitle\'] = !empty($longtitle) ? $longtitle : $siteName; } else { $seoProTitle[\'pagetitle\'] = !empty($longtitle) ? $longtitle : $pagetitle; if ($siteUseSitename) { $seoProTitle[\'delimiter\'] = $siteDelimiter; $seoProTitle[\'sitename\'] = $siteName; } } $modx->setPlaceholder(\'seoPro.title\', implode(" ", $seoProTitle)); if ($siteBranding) { $modx->regClientStartupHTMLBlock(\'\'); } break; }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 27 => array ( 'id' => '27', 'source' => '0', 'property_preprocess' => '0', 'name' => 'SimpleSearchIndexer', 'description' => 'Automatically indexes Resources into Solr.', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * SimpleSearch * * Copyright 2010-11 by Shaun McCormick * * This file is part of SimpleSearch, a simple search component for MODx * Revolution. It is loosely based off of AjaxSearch for MODx Evolution by * coroico/kylej, minus the ajax. * * SimpleSearch is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * SimpleSearch is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * SimpleSearch; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307 USA * * @package simplesearch */ /** * Plugin to index Resources whenever they are changed, published, unpublished, * deleted, or undeleted. * * @var modX $modx * @var SimpleSearch $search * * @package simplesearch */ require_once $modx->getOption(\'sisea.core_path\',null,$modx->getOption(\'core_path\').\'components/simplesearch/\').\'model/simplesearch/simplesearch.class.php\'; $search = new SimpleSearch($modx,$scriptProperties); $search->loadDriver($scriptProperties); if (!$search->driver || (!($search->driver instanceof SimpleSearchDriverSolr) && !($search->driver instanceof SimpleSearchDriverElastic))) return; /** * helper method for missing params in events * @param modX $modx * @param array $children * @param int $parent * @return boolean */ if (!function_exists(\'SimpleSearchGetChildren\')) { function SimpleSearchGetChildren(&$modx,&$children,$parent) { $success = false; $kids = $modx->getCollection(\'modResource\',array( \'parent\' => $parent, )); if (!empty($kids)) { /** @var modResource $kid */ foreach ($kids as $kid) { $children[] = $kid->toArray(); SimpleSearchGetChildren($modx,$children,$kid->get(\'id\')); } } return $success; } } $action = \'index\'; $resourcesToIndex = array(); switch ($modx->event->name) { case \'OnDocFormSave\': $action = \'index\'; $resourceArray = $scriptProperties[\'resource\']->toArray(); if ($resourceArray[\'published\'] == 1 && $resourceArray[\'deleted\'] == 0) { $action = \'index\'; foreach ($_POST as $k => $v) { if (substr($k,0,2) == \'tv\') { $id = str_replace(\'tv\',\'\',$k); /** @var modTemplateVar $tv */ $tv = $modx->getObject(\'modTemplateVar\',$id); if ($tv) { $resourceArray[$tv->get(\'name\')] = $tv->renderOutput($resource->get(\'id\')); $modx->log(modX::LOG_LEVEL_DEBUG,\'Indexing \'.$tv->get(\'name\').\': \'.$resourceArray[$tv->get(\'name\')]); } unset($resourceArray[$k]); } } } else { $action = \'removeIndex\'; } unset($resourceArray[\'ta\'],$resourceArray[\'action\'],$resourceArray[\'tiny_toggle\'],$resourceArray[\'HTTP_MODAUTH\'],$resourceArray[\'modx-ab-stay\'],$resourceArray[\'resource_groups\']); $resourcesToIndex[] = $resourceArray; break; case \'OnDocPublished\': $action = \'index\'; $resourceArray = $scriptProperties[\'resource\']->toArray(); unset($resourceArray[\'ta\'],$resourceArray[\'action\'],$resourceArray[\'tiny_toggle\'],$resourceArray[\'HTTP_MODAUTH\'],$resourceArray[\'modx-ab-stay\'],$resourceArray[\'resource_groups\']); $resourcesToIndex[] = $resourceArray; break; case \'OnDocUnpublished\': case \'OnDocUnPublished\': $action = \'removeIndex\'; $resourceArray = $scriptProperties[\'resource\']->toArray(); unset($resourceArray[\'ta\'],$resourceArray[\'action\'],$resourceArray[\'tiny_toggle\'],$resourceArray[\'HTTP_MODAUTH\'],$resourceArray[\'modx-ab-stay\'],$resourceArray[\'resource_groups\']); $resourcesToIndex[] = $resourceArray; break; case \'OnResourceDuplicate\': $action = \'index\'; /** @var modResource $newResource */ $resourcesToIndex[] = $newResource->toArray(); $children = array(); SimpleSearchGetChildren($modx,$children,$newResource->get(\'id\')); foreach ($children as $child) { $resourcesToIndex[] = $child; } break; case \'OnResourceDelete\': $action = \'removeIndex\'; $resourcesToIndex[] = $resource->toArray(); $children = array(); SimpleSearchGetChildren($modx,$children,$resource->get(\'id\')); foreach ($children as $child) { $resourcesToIndex[] = $child; } break; case \'OnResourceUndelete\': $action = \'index\'; $resourcesToIndex[] = $resource->toArray(); $children = array(); SimpleSearchGetChildren($modx,$children,$resource->get(\'id\')); foreach ($children as $child) { $resourcesToIndex[] = $child; } break; } foreach ($resourcesToIndex as $resourceArray) { if (!empty($resourceArray[\'id\'])) { if ($action == \'index\') { $search->driver->index($resourceArray); } else if ($action == \'removeIndex\') { $search->driver->removeIndex($resourceArray[\'id\']); } } } return;', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 28 => array ( 'id' => '28', 'source' => '1', 'property_preprocess' => '0', 'name' => 'PageLocker', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => '/** * * PageLocker * * Simple front-end password protection for individual or groups of pages. * * @ author Aaron Ladage (mods by Bob Ray) * @ version 1.1.0-beta1 - June 21, 2012 * * PLUGIN PROPERTIES * &tvPassword - (Required) The TV for the password (default: \'pagePassword\') * &tvPasswordGroup - The TV for the password group (default: \'pagePasswordGroup\'). Not required, but a good idea, unless you want all password-protected pages to be accessible with the same password. * &formResourceID - (Required) The ID of the password form page (no default set, but absolutely necessary -- the plugin will not work without it) * **/ /* @var $modx modX */ /* @var $scriptProperties array */ if (!function_exists("toForm")) { /* Show Login form */ function toForm($resourceId) { global $modx; unset($_SESSION[\'password\']); // make sure password is not still set if ($modx->resource->get(\'id\') != $resourceId) { // prevent infinite loop $modx->sendForward($resourceId); } } } // Get the default plugin properties $tvPassword = $modx->getOption(\'tvPassword\',$scriptProperties,\'pagePassword\'); $tvPasswordGroup = $modx->getOption(\'tvPasswordGroup\',$scriptProperties,\'pagePasswordGroup\'); $formResourceID = $modx->getOption(\'formResourceID\', $scriptProperties); // Get the password and password group values from the page\'s template variables $resourcePW = $modx->resource->getTVValue($tvPassword); $resourceGroup = $modx->resource->getTVValue($tvPasswordGroup); /* Do nothing if page is not password-protected, or the form page is not set in the properties */ if ((empty($resourcePW)) || (empty($formResourceID))) { return; } // Set additional defaults $resourceGroup = empty($resourceGroup) ? 0 : $resourceGroup; $groups = isset($_SESSION[\'groups\'])? $modx->fromJSON($_SESSION[\'groups\']) : array(); /* Get and sanitize the password submitted by the user (if any) */ $userPW = isset($_POST[\'password\'])? filter_var($_POST[\'password\'], FILTER_SANITIZE_STRING) : \'\'; if (!empty($userPW)) { /* Form was submitted */ if ($userPW == $resourcePW) { /* password matches the page\'s password */ /* Set the logged in and groups session */ $_SESSION[\'loggedin\'] = 1; if (! in_array($resourceGroup, $groups)) { $groups[] = $resourceGroup; $groupsJSON = $modx->toJSON($groups); $_SESSION[\'groups\'] = $groupsJSON; } return; } else { // Doesn\'t match. Back to the form! toForm($formResourceID); } } else { // Form wasn\'t submitted, so check for logged in and groups sessions if ( empty($groups) || ! isset($_SESSION[\'loggedin\']) || (! $_SESSION[\'loggedin\'] === 1) || (! in_array($resourceGroup, $groups))) { toForm($formResourceID); } }', 'locked' => '0', 'properties' => 'a:3:{s:14:"formResourceID";a:7:{s:4:"name";s:14:"formResourceID";s:4:"desc";s:75:"The ID of the password form page. No default set, but absolutely necessary.";s:4:"type";s:9:"textfield";s:7:"options";a:0:{}s:5:"value";s:3:"219";s:7:"lexicon";N;s:4:"area";s:0:"";}s:10:"tvPassword";a:7:{s:4:"name";s:10:"tvPassword";s:4:"desc";s:24:"The TV for the password.";s:4:"type";s:9:"textfield";s:7:"options";a:0:{}s:5:"value";s:12:"pagePassword";s:7:"lexicon";N;s:4:"area";s:0:"";}s:15:"tvPasswordGroup";a:7:{s:4:"name";s:15:"tvPasswordGroup";s:4:"desc";s:147:"The TV for the password group. Not required, but a good idea, unless you want all password-protected pages to be accessible with the same password.";s:4:"type";s:9:"textfield";s:7:"options";a:0:{}s:5:"value";s:17:"pagePasswordGroup";s:7:"lexicon";N;s:4:"area";s:0:"";}}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 31 => array ( 'id' => '31', 'source' => '0', 'property_preprocess' => '0', 'name' => 'imageSlimCacheManager', 'description' => 'Handles remote images cache cleaning when clearing the site cache.', 'editor_type' => '0', 'category' => '61', 'cache_type' => '0', 'plugincode' => '/** * imageSlim * Copyright 2013 Jason Grant * * Documentation, bug reports, etc. * https://github.com/oo12/imageSlim * * imageSlim is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) any * later version. * * imageSlim is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * imageSlim; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA * * @package imageslim */ /** * Handles cache management for imageSlim * * @var modX $modx * * @package imageslim */ if ($modx->event->name !== \'OnSiteRefresh\') { return; } $cachePath = MODX_ASSETS_PATH . \'components/imageslim/cache/\'; if (!is_writable($cachePath)) { // check that the cache directory is writable if (!$modx->cacheManager->writeTree($cachePath)) { $modx->log(modX::LOG_LEVEL_ERROR, \'[imageSlim] Cache path not writable: \' . $cachePath); return; } } $cache_maxage = $modx->getOption(\'phpthumb_cache_maxage\', NULL, 30) * 86400; $cache_maxsize = $modx->getOption(\'phpthumb_cache_maxsize\', NULL, 100) * 1048576; $cache_maxfiles = (int) $modx->getOption(\'phpthumb_cache_maxfiles\', NULL, 10000); $modx->log(modX::LOG_LEVEL_INFO, \'imageSlimCacheManager: Cleaning imageSlim remote images cache...\'); $modx->log(modX::LOG_LEVEL_INFO, ":: Max Age: $cache_maxage seconds || Max Size: $cache_maxsize bytes || Max Files: $cache_maxfiles"); if (!($cache_maxage || $cache_maxsize || $cache_maxfiles)) { return; } $DeletedKeys = array(); $AllFilesInCacheDirectory = array(); $dirname = rtrim(realpath($cachePath), \'/\\\\\'); if ($dirhandle = @opendir($dirname)) { while (($file = readdir($dirhandle)) !== FALSE) { $fullfilename = $dirname . DIRECTORY_SEPARATOR . $file; if (is_file($fullfilename) && preg_match(\'/(jpe?g|png|gif)$/\', $file)) { $AllFilesInCacheDirectory[] = $fullfilename; } } closedir($dirhandle); } $totalimages = count($AllFilesInCacheDirectory); $modx->log(modX::LOG_LEVEL_INFO, ":: $totalimages image" . ($totalimages !== 1 ? \'s\':\'\') . \' in the cache\'); if (empty($AllFilesInCacheDirectory)) { return; } $CacheDirOldFilesAge = array(); $CacheDirOldFilesSize = array(); foreach ($AllFilesInCacheDirectory as $fullfilename) { $CacheDirOldFilesAge[$fullfilename] = @fileatime($fullfilename); if ($CacheDirOldFilesAge[$fullfilename] == 0) { $CacheDirOldFilesAge[$fullfilename] = @filemtime($fullfilename); } $CacheDirOldFilesSize[$fullfilename] = @filesize($fullfilename); } $DeletedKeys[\'zerobyte\'] = array(); foreach ($CacheDirOldFilesSize as $fullfilename => $filesize) { // purge all zero-size files more than an hour old (to prevent trying to delete just-created and/or in-use files) $cutofftime = time() - 3600; if (($filesize == 0) && ($CacheDirOldFilesAge[$fullfilename] < $cutofftime)) { if (@unlink($fullfilename)) { $DeletedKeys[\'zerobyte\'][] = $fullfilename; unset($CacheDirOldFilesSize[$fullfilename]); unset($CacheDirOldFilesAge[$fullfilename]); } } } $modx->log(modX::LOG_LEVEL_INFO, \':: Purged \' . count($DeletedKeys[\'zerobyte\']) . \' zero-byte images\'); asort($CacheDirOldFilesAge); if ($cache_maxfiles) { $TotalCachedFiles = count($CacheDirOldFilesAge); $DeletedKeys[\'maxfiles\'] = array(); foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { if ($TotalCachedFiles > $cache_maxfiles) { if (@unlink($fullfilename)) { --$TotalCachedFiles; $DeletedKeys[\'maxfiles\'][] = $fullfilename; } } else { // there are few enough files to keep the rest break; } } $modx->log(modX::LOG_LEVEL_INFO, \':: Purged \' . count($DeletedKeys[\'maxfiles\']) . " images based on (cache_maxfiles=$cache_maxfiles)"); foreach ($DeletedKeys[\'maxfiles\'] as $fullfilename) { unset($CacheDirOldFilesAge[$fullfilename]); unset($CacheDirOldFilesSize[$fullfilename]); } } if ($cache_maxage) { $mindate = time() - $cache_maxage; $DeletedKeys[\'maxage\'] = array(); foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { if ($filedate) { if ($filedate < $mindate) { if (@unlink($fullfilename)) { $DeletedKeys[\'maxage\'][] = $fullfilename; } } else { // the rest of the files are new enough to keep break; } } } $modx->log(modX::LOG_LEVEL_INFO, \':: Purged \' . count($DeletedKeys[\'maxage\']) . \' images based on (cache_maxage=\'. $cache_maxage / 86400 .\' days)\'); foreach ($DeletedKeys[\'maxage\'] as $fullfilename) { unset($CacheDirOldFilesAge[$fullfilename]); unset($CacheDirOldFilesSize[$fullfilename]); } } if ($cache_maxsize) { $TotalCachedFileSize = array_sum($CacheDirOldFilesSize); $DeletedKeys[\'maxsize\'] = array(); foreach ($CacheDirOldFilesAge as $fullfilename => $filedate) { if ($TotalCachedFileSize > $cache_maxsize) { if (@unlink($fullfilename)) { $TotalCachedFileSize -= $CacheDirOldFilesSize[$fullfilename]; $DeletedKeys[\'maxsize\'][] = $fullfilename; } } else { // the total filesizes are small enough to keep the rest of the files break; } } $modx->log(modX::LOG_LEVEL_INFO, \':: Purged \' . count($DeletedKeys[\'maxsize\']) . \' images based on (cache_maxsize=\' . $cache_maxsize / 1048576 . \' MB)\'); foreach ($DeletedKeys[\'maxsize\'] as $fullfilename) { unset($CacheDirOldFilesAge[$fullfilename]); unset($CacheDirOldFilesSize[$fullfilename]); } } $totalpurged = 0; foreach ($DeletedKeys as $key => $value) { $totalpurged += count($value); } $modx->log(modX::LOG_LEVEL_INFO, ":: Purged $totalpurged images out of $totalimages");', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 33 => array ( 'id' => '33', 'source' => '0', 'property_preprocess' => '0', 'name' => 'TinyMCERTE', 'description' => '', 'editor_type' => '0', 'category' => '76', 'cache_type' => '0', 'plugincode' => '/** * TinyMCE Rich Tech Editor * */ $corePath = $modx->getOption(\'tinymcerte.core_path\', null, $modx->getOption(\'core_path\', null, MODX_CORE_PATH) . \'components/tinymcerte/\'); /** @var TinyMCERTE $tinymcerte */ $tinymcerte = $modx->getService( \'tinymcerte\', \'TinyMCERTE\', $corePath . \'model/tinymcerte/\', array( \'core_path\' => $corePath ) ); $className = \'TinyMCERTE\' . $modx->event->name; $modx->loadClass(\'TinyMCERTEPlugin\', $tinymcerte->getOption(\'modelPath\') . \'tinymcerte/events/\', true, true); $modx->loadClass($className, $tinymcerte->getOption(\'modelPath\') . \'tinymcerte/events/\', true, true); if (class_exists($className)) { /** @var TinyMCERTEPlugin $handler */ $handler = new $className($modx, $scriptProperties); $handler->run(); } return;', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 34 => array ( 'id' => '34', 'source' => '0', 'property_preprocess' => '0', 'name' => 'MIGX', 'description' => '', 'editor_type' => '0', 'category' => '85', 'cache_type' => '0', 'plugincode' => '$corePath = $modx->getOption(\'migx.core_path\',null,$modx->getOption(\'core_path\').\'components/migx/\'); $assetsUrl = $modx->getOption(\'migx.assets_url\', null, $modx->getOption(\'assets_url\') . \'components/migx/\'); switch ($modx->event->name) { case \'OnTVInputRenderList\': $modx->event->output($corePath.\'elements/tv/input/\'); break; case \'OnTVInputPropertiesList\': $modx->event->output($corePath.\'elements/tv/inputoptions/\'); break; case \'OnDocFormPrerender\': $modx->controller->addCss($assetsUrl.\'css/mgr.css\'); break; /* case \'OnTVOutputRenderList\': $modx->event->output($corePath.\'elements/tv/output/\'); break; case \'OnTVOutputRenderPropertiesList\': $modx->event->output($corePath.\'elements/tv/properties/\'); break; case \'OnDocFormPrerender\': $assetsUrl = $modx->getOption(\'colorpicker.assets_url\',null,$modx->getOption(\'assets_url\').\'components/colorpicker/\'); $modx->regClientStartupHTMLBlock(\'\'); $modx->regClientStartupScript($assetsUrl.\'sources/ColorPicker.js\'); $modx->regClientStartupScript($assetsUrl.\'sources/ColorMenu.js\'); $modx->regClientStartupScript($assetsUrl.\'sources/ColorPickerField.js\'); $modx->regClientCSS($assetsUrl.\'resources/css/colorpicker.css\'); break; */ } return;', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => '', ), 37 => array ( 'id' => '37', 'source' => '1', 'property_preprocess' => '0', 'name' => 'Tickets', 'description' => '', 'editor_type' => '0', 'category' => '95', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnSiteRefresh\': if ($modx->cacheManager->refresh(array(\'default/tickets\' => array()))) { $modx->log(modX::LOG_LEVEL_INFO, $modx->lexicon(\'refresh_default\') . \': Tickets\'); } break; case \'OnDocFormSave\': /* @var Ticket $resource */ if ($mode == \'new\' && $resource->class_key == "Ticket") { $modx->cacheManager->delete(\'tickets/latest.tickets\'); } /* @var TicketsSection $resource */ if ($mode == \'upd\' && $resource->class_key == \'TicketsSection\') { if (method_exists($resource, \'clearCache\')) { $resource->clearCache(); } } break; case \'OnWebPagePrerender\': $output = &$modx->resource->_output; $output = str_replace( array(\'*(*(*(*(*(*\', \'*)*)*)*)*)*\', \'~(~(~(~(~(~\', \'~)~)~)~)~)~\'), array(\'[\', \']\', \'{\', \'}\'), $output ); break; case \'OnPageNotFound\': // It is working only with friendly urls enabled $q = trim(@$_REQUEST[$modx->context->getOption(\'request_param_alias\', \'q\')]); $matches = explode(\'/\', rtrim($q, \'/\')); if (count($matches) < 2) { return; } $ticket_uri = array_pop($matches); $section_uri = implode(\'/\', $matches) . \'/\'; if ($section_id = $modx->findResource($section_uri)) { /** @var TicketsSection $section */ if ($section = $modx->getObject(\'TicketsSection\', $section_id)) { if (is_numeric($ticket_uri)) { $ticket_id = $ticket_uri; } elseif (preg_match(\'#^\\d+#\', $ticket_uri, $tmp)) { $ticket_id = $tmp[0]; } else { $properties = $section->getProperties(\'tickets\'); if (!empty($properties[\'uri\']) && strpos($properties[\'uri\'], \'%id\') !== false) { $pcre = str_replace(\'%id\', \'([0-9]+)\', $properties[\'uri\']); $pcre = preg_replace(\'#(\\%[a-z]+)#\', \'(?:.*?)\', $pcre); if (preg_match($pcre, $ticket_uri, $matches)) { $ticket_id = $matches[1]; } } } if (!empty($ticket_id)) { if ($ticket = $modx->getObject(\'Ticket\', array(\'id\' => $ticket_id, \'deleted\' => 0))) { if ($ticket->published) { $modx->sendRedirect($modx->makeUrl($ticket_id), array(\'responseCode\' => \'HTTP/1.1 301 Moved Permanently\')); } elseif ($unp_id = $modx->getOption(\'tickets.unpublished_ticket_page\')) { $modx->sendForward($unp_id); } } } } } break; case \'OnLoadWebDocument\': $authenticated = $modx->user->isAuthenticated($modx->context->get(\'key\')); $key = \'Tickets_User\'; if (!$authenticated && !$modx->getOption(\'tickets.count_guests\')) { return; } if (empty($_COOKIE[$key])) { if (!empty($_SESSION[$key])) { $guest_key = $_SESSION[$key]; } else { $guest_key = $_SESSION[$key] = md5(rand() . time() . rand()); } setcookie($key, $guest_key, time() + (86400 * 365), \'/\'); } else { $guest_key = $_COOKIE[$key]; } if (empty($_SESSION[$key])) { $_SESSION[$key] = $guest_key; } if ($authenticated) { /** @var TicketAuthor $profile */ if (!$profile = $modx->user->getOne(\'AuthorProfile\')) { $profile = $modx->newObject(\'TicketAuthor\'); $modx->user->addOne($profile); } $profile->set(\'visitedon\', time()); $profile->save(); } break; case \'OnWebPageComplete\': /** @var Tickets $Tickets */ $Tickets = $modx->getService(\'tickets\'); $Tickets->logView($modx->resource->get(\'id\')); break; case \'OnUserSave\': /** @var modUser $user */ if ($mode == \'new\' && $user && !$user->getOne(\'AuthorProfile\')) { $profile = $modx->newObject(\'TicketAuthor\'); $user->addOne($profile); $profile->save(); } break; }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => 'core/components/tickets/elements/plugins/plugin.tickets.php', ), 38 => array ( 'id' => '38', 'source' => '6', 'property_preprocess' => '0', 'name' => 'plugin', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case "OnLoadWebDocument": if ($modx->context->key == "mgr") { return; } if ($modx->getAuthenticatedUser() && $modx->resource->id == $modx->getOption(\'page_register\')) { $modx->sendRedirect($modx->makeUrl($modx->getOption(\'page_profile\'), \'\', \'\', \'full\')); } $modx->lexicon->load(\'core:site\'); if (is_object($modx->resource) && $modx->resource->id > 0 && $modx->resource->template > 0 && $template = $modx->resource->getOne(\'Template\')->getProperties()) { if (is_array($template) && count($template)) { $modx->setPlaceholders($template, \'template.\'); } } if (isset($template[\'auth\']) && $template[\'auth\'] && !$modx->getAuthenticatedUser()) { $modx->sendForward($modx->getOption(\'page_login\')); } $post = $modx->request->parameters[\'POST\']; $get = $modx->request->parameters[\'GET\']; $modx->setPlaceholders(array_merge($get, $post), \'REQUEST.\'); if ($_GET[\'pdf\'] == \'view\' && $modx->resource && $modx->resource->id > 0 && $modx->resource->parent == $modx->getOption(\'page_recipes\')) { $modx->getService(\'pdfresource\', \'PDFResource\', MODX_CORE_PATH . \'components/pdfresource/model/pdfresource/\'); header(\'Content-Type: application/pdf\'); header(\'Content-Disposition:inline;filename=\' . $modx->resource->get(\'alias\') . \'.pdf\'); echo $modx->pdfresource->createPDF($modx->resource, false); die(); } $ajax = isset($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && !empty($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && strtolower($_SERVER[\'HTTP_X_REQUESTED_WITH\']) == \'xmlhttprequest\'; if ($ajax) { if ($post[\'type\'] == \'ajax\') { $modx->getService(\'pdoTools\'); $return = array(\'success\' => false, \'message\' => \'\'); switch ($post[\'action\']) { case "profileSave": unset($post[\'internalKey\'], $post[\'id\'], $post[\'email\'], $post[\'type\'], $post[\'action\']); $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_error\'); if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } if ($profile = $modx->user->getOne(\'Profile\')) { $fields = $modx->getFields(\'modUserProfile\'); foreach ($post as $k => $v) { if (isset($fields[$k])) { if ($k == \'dob\' && !is_numeric($v)) { $v = strtotime($v); } $profile->set($k, $v); unset($post[$k]); } } $profile->set(\'extended\', array_merge((is_array($profile->get(\'extended\')) ? $profile->get(\'extended\') : array()), $post)); $return[\'success\'] = $profile->save(); $modx->user->save(); $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_success\'); $return[\'url\'] = $modx->makeUrl($modx->getOption(\'page_profile\'), \'\', \'\', \'full\'); } break; case "profileUpdate": $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); unset($post[\'internalKey\'], $post[\'type\'], $post[\'action\']); $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_error\'); if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $post[\'id\'] = $modx->user->id; if ($post[\'specifiedpassword\']) { $post = array_merge($post, array( \'passwordnotifymethod\' => \'s\', \'passwordgenmethod\' => \'spec\', \'newpassword\' => \'true\', \'specifiedpassword\' => $post[\'specifiedpassword\'], \'confirmpassword\' => $post[\'confirmpassword\'], )); } unset($post[\'password\'], $post[\'confirm_password\']); $return = $modx->runProcessor(\'web/user/update\', $post, array(\'processors_path\' => $modx->getOption(\'core_path\') . \'components/usersaveinfo/processors/\'))->response; if ($return[\'success\']) { $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_success\'); $return[\'url\'] = $modx->makeUrl($modx->getOption(\'page_profile\'), \'\', \'\', \'full\'); break; } $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_error\'); break; case "profileSaveField": $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_error\'); if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } if (in_array($post[\'field\'], array(\'internalKey\', \'id\', \'email\'))) { break; } $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); if ($modx->usersaveinfo->changeField($modx->user->id, $post[\'field\'], $post[\'value\'])) { $profile = $modx->getObject(\'modUserProfile\', [\'internalKey\' => $modx->user->id]); $profile = array_merge($profile->get(\'extended\'), $profile->toArray()); $profile[$post[\'field\']] = $post[\'value\']; $return[\'success\'] = true; $return[\'message\'] = $modx->lexicon(\'text_message_profile_save_success\'); $return[\'field\'] = $post[\'field\']; $return[\'value\'] = $post[\'value\']; $return[\'data\'] = array( \'callories\' => $modx->usersaveinfo->getCalories($profile), \'energy\' => $modx->usersaveinfo->getEnergy($profile), \'bmi\' => $modx->usersaveinfo->getBMI($profile), \'diabet\' => $modx->usersaveinfo->getDiabetRisk($profile), \'recommended_food\' => implode(\',\', $modx->usersaveinfo->getRecomendedFood($profile)[1]), \'weight_trend\' => implode(\',\', $modx->usersaveinfo->getChartWeight($modx->user->id)), ); } break; case "getProducts": $return = array(\'success\' => true, \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/getproduct.php\', array( \'category\' => $post[\'category\'], \'tags\' => $post[\'tags\'], \'search\' => $post[\'search\'], \'tpl\' => \'@FILE chunks/recipes/mp_row.tpl\', \'offset\' => $post[\'offset\'], )), \'total\' => $modx->getPlaceholder(\'total\'), \'page\' => $modx->getPlaceholder(\'page\'), ); break; case "getRecipes": $return = array(\'success\' => true, \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/getproduct.php\', array( \'category\' => $post[\'category\'], \'tags\' => $post[\'tags\'], \'search\' => $post[\'search\'], \'tpl\' => \'@FILE chunks/recipes/row.tpl\', \'offset\' => $post[\'offset\'], \'limit\' => 15, )), \'total\' => $modx->getPlaceholder(\'total\'), \'page\' => $modx->getPlaceholder(\'page\'), ); break; case "saveMP": if (!$post[\'data\']) { $return[\'message\'] = $modx->lexicon(\'text_mp_error_empty_plan\'); break; } $return[\'message\'] = $modx->lexicon(\'text_mp_plan_error\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); if ($modx->mealplanner->saveMP($modx->user->id, $post[\'data\'])) { if ($profile = $modx->user->getOne(\'Profile\')) { $extended = $profile->get(\'extended\'); if (isset($extended[\'surgery\'])) { $temp = $modx->usersaveinfo->findCCG($profile->get(\'zip\'), $extended[\'surgery\']); if (is_array($temp) && isset($temp[\'IsSubscribed\']) && $temp[\'IsSubscribed\']) { $expert = 1; } } } $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_plan_success\'), \'auth\' => (boolean)$modx->getAuthenticatedUser() , \'expert\' => $expert); } break; case "saveMPTemplate": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } if (!$post[\'data\']) { $return[\'message\'] = $modx->lexicon(\'text_mp_error_empty_plan\'); break; } if (!$post[\'name\'] && !$post[\'template\']) { $return[\'message\'] = $modx->lexicon(\'text_mp_error_empty_template\'); break; } $return[\'message\'] = $modx->lexicon(\'text_mp_error_save_template\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $temp = $modx->mealplanner->saveMPTemplate($modx->user->id, $post[\'name\'], $post[\'template\'], $post[\'data\']); if ($temp === true) { $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_template_save_success\')); } if ($temp === null) { $return[\'message\'] = $modx->lexicon(\'text_mp_error_dubl_template\'); } break; case "saveMPLoadTemplate": $return = array(\'success\' => true, \'message\' => \'\', \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/mp/templates.php\' , array(\'tpl\' => \'@INLINE \'))); break; case "removeMPTemplate": $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $temp = $modx->mealplanner->removeTemplate($modx->user->id, $post[\'template\']); $return = array(\'success\' => (boolean)$temp, \'message\' => ($temp ? $modx->lexicon(\'text_mp_remove_template_success\') : $modx->lexicon(\'text_mp_remove_template_remove\'))); break; case "setMPTemplate": if (!$post[\'template\']) { $return[\'message\'] = $modx->lexicon(\'text_mp_error_empty_template\'); break; } $return[\'message\'] = $modx->lexicon(\'text_mp_error_set_template\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $temp = $modx->mealplanner->setTemplate($modx->user->id, $post[\'template\']); $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_set_template\'), \'text\' => json_encode($temp)); break; case "MPTemplateLoad": $return[\'message\'] = $modx->lexicon(\'text_mp_error_set_template\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $temp = $modx->mealplanner->setTemplate($modx->user->id, $post[\'template\']); if ($temp) { $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_set_template\'), \'text\' => json_encode($temp)); } break; case "addRecipeMP": if (!$post[\'date\'] || !$post[\'id\'] || !$post[\'types\']) { $return[\'message\'] = $modx->lexicon(\'text_recipe_mp_error_data\'); break; } $return[\'message\'] = $modx->lexicon(\'text_recipe_mp_error_data\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); if ($modx->mealplanner->saveOneRecipe($modx->user->id, $post[\'date\'], $post[\'types\'], $post[\'id\'])) { $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_plan_success\'), \'auth\' => (boolean)$modx->getAuthenticatedUser()); } break; case "saveMPNutritionist": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); if ($profile = $modx->user->getOne(\'Profile\')) { $extended = $profile->get(\'extended\'); if (isset($extended[\'surgery\'])) { $temp = $modx->usersaveinfo->findCCG($profile->get(\'zip\'), $extended[\'surgery\']); if (!$temp || !$temp[\'IsSubscribed\']) { $return[\'message\'] = $modx->lexicon(\'text_mp_plan_nutritional_no_subscribe\'); break; } } } $return[\'message\'] = $modx->lexicon(\'text_mp_plan_nutritional_error\'); $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); if ($modx->mealplanner->saveMPNutritionist($modx->user->id, $post[\'days\'], $post[\'comment\'], $post[\'shared\'])) { $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_mp_plan_nutritional_success\'), \'auth\' => (boolean)$modx->getAuthenticatedUser()); } break; case "register": if ($modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_auth_already\'); $return[\'errors\'][] = array(\'id\' => \'username\', \'msg\' => $modx->lexicon(\'text_auth_already\')); break; } if (!filter_var($post[\'username\'], FILTER_VALIDATE_EMAIL)) { $return[\'message\'] = $modx->lexicon(\'text_auth_email_invalid\'); $return[\'errors\'][] = array(\'id\' => \'username\', \'msg\' => $modx->lexicon(\'text_auth_email_invalid\')); break; } $post = array_merge($post, array( \'email\' => $post[\'username\'], \'passwordnotifymethod\' => \'s\', \'passwordgenmethod\' => \'spec\', \'newpassword\' => true, \'specifiedpassword\' => $post[\'password\'], \'confirmpassword\' => $post[\'password\'], )); $return = $modx->runProcessor(\'web/user/create\', $post, array(\'processors_path\' => $modx->getOption(\'core_path\') . \'components/extension/processors/\')); if ($return->response[\'success\']) { $return->response[\'url\'] = $modx->makeUrl($modx->getOption(\'page_register_success\'), \'\', \'\', \'full\'); } $return = $return->response; break; case "login": if ($modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_auth_already\'); break; } $post = array_merge($post, array( \'email\' => $post[\'username\'], \'rememberme\' => true, )); $return = $modx->runProcessor(\'security/login\', $post); if ($return->response[\'success\']) { $return->response[\'url\'] = $modx->makeUrl($modx->getOption(\'page_profile\'), \'\', \'\', \'full\'); } $return = $return->response; break; case "ateCreate": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $data = array( \'capcha\' => $post[\'g-recaptcha-response\'], \'category\' => $post[\'category\'], \'user_id\' => $modx->user->id, \'ask\' => $post[\'ask\'], \'answer\' => \'\', \'expert\' => 0, \'status\' => 0, \'private\' => isset($post[\'private\']) ? $post[\'private\'] : \'\', \'shared\' => isset($post[\'shared\']) ? $post[\'shared\'] : \'\', ); $modx->getService(\'asktheexpert\', \'asktheexpert\', $modx->getOption(\'core_path\') . \'components/asktheexpert/model/asktheexpert/\'); $return = $modx->runProcessor(\'web/ask/create\', $data, array(\'processors_path\' => $modx->asktheexpert->config[\'processorsPath\']))->response; break; case "messageGetList": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $return = array(\'success\' => true, \'message\' => \'\', \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/message/getlist.php\' , array(\'tpl\' => \'@FILE chunks/message/row.tpl\', \'tplATE\' => \'@FILE chunks/message/row_ate.tpl\', \'receiver\' => $post[\'receiver\']))); break; case "messageSend": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } if (!$post[\'message\']) { $return[\'message\'] = $modx->lexicon(\'text_message_response_err_message\'); break; } // if (!$post[\'category\']) { // $return[\'message\'] = $modx->lexicon(\'text_message_response_err_category\'); // break; // } $modx->getService(\'extension\', \'extension\', $modx->getOption(\'core_path\') . \'components/extension/model/extension/\'); if (substr($post[\'receiver\'], 0, 4) == \'ate_\') { $id = explode(\'_\', $post[\'receiver\'])[1]; $modx->getService(\'asktheexpert\', \'asktheexpert\', $modx->getOption(\'core_path\') . \'components/asktheexpert/model/asktheexpert/\'); $response = $modx->runProcessor(\'web/message/create\', [\'ask_id\' => $id, \'message\' => $post[\'message\']], array(\'processors_path\' => $modx->getOption(\'core_path\') . \'components/asktheexpert/processors/\'))->response; $response[\'message\'] = !$response[\'success\'] ? $modx->lexicon(\'text_message_response_err_category\') : \'\'; } else { $c = $modx->newQuery(\'modUserMessage\'); $c->select($modx->getSelectColumns(\'modUserMessage\', \'modUserMessage\', \'\')); $c->where(array( \'modUserMessage.recipient\' => $post[\'receiver\'], )); $c->sortby(\'modUserMessage.date_sent\', \'DESC\'); $c->limit(1); if (!$obj = $modx->getObject(\'modUserMessage\', $c)) { $obj = $modx->newObject(\'modUserMessage\'); } $array = array( \'type\' => \'user\', \'subject\' => \'Re: \' . str_replace(array(\'Re: \', \'RE: \'), \'\', $obj->get(\'subject\')), \'message\' => $post[\'message\'], \'user\' => $post[\'receiver\'], \'sendemail\' => 1, // \'category\' => $post[\'category\'], ); $response = $modx->runProcessor(\'web/message/create\', $array, array(\'processors_path\' => $modx->getOption(\'core_path\') . \'components/extension/processors/\'))->response; } if ($response[\'success\']) { $return = array(\'success\' => true, \'message\' => $modx->lexicon(\'text_message_response_send_success\'), \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/message/getlist.php\' , array(\'tpl\' => \'@FILE chunks/message/row.tpl\', \'tplATE\' => \'@FILE chunks/message/row_ate.tpl\', \'receiver\' => $post[\'receiver\']))); } else { $return[\'message\'] = $response[\'message\']; } break; case "mpSwapOne": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $return = array(\'success\' => true, \'message\' => \'\', \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/mp/swaplist.php\' , array(\'tplNew\' => \'@FILE chunks/mealplanner/recipeswapnew.tpl\', \'tplOld\' => \'@FILE chunks/mealplanner/recipeswapold.tpl\', \'id\' => $post[\'id\'], \'calories\' => $post[\'calories\'], \'exclude\' => $post[\'exclude\']))); break; case "mpGetWeekOffset": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $temp = $modx->mealplanner->getWeek($post[\'date\']); if (is_array($temp)) { $return = array(\'success\' => true, \'message\' => \'\', \'offset\' => $temp[\'offset\'], \'day\' => $temp[\'day\']); } break; case "favorites": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $modx->getService(\'favorites\', \'favorites\', $modx->getOption(\'core_path\') . \'components/favorites/model/favorites/\'); if ($obj = $modx->getObject(\'extFavorites\', array(\'resource_id\' => $post[\'resource_id\'], \'createdby\' => $modx->user->id))) { $return = $modx->runProcessor(\'web/remove\', array(\'id\' => $obj->get(\'id\'), \'createdby\' => $modx->user->id), array(\'processors_path\' => $modx->favorites->config[\'processorsPath\']))->response; $return[\'mode\'] = \'remove\'; } else { $return = $modx->runProcessor(\'web/create\', array(\'resource_id\' => $post[\'resource_id\'], \'createdby\' => $modx->user->id), array(\'processors_path\' => $modx->favorites->config[\'processorsPath\']))->response; $return[\'mode\'] = \'create\'; } break; case "favoriteRemove": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $modx->getService(\'favorites\', \'favorites\', $modx->getOption(\'core_path\') . \'components/favorites/model/favorites/\'); if ($obj = $modx->getObject(\'extFavorites\', array(\'resource_id\' => $post[\'resource_id\'], \'createdby\' => $modx->user->id))) { $id = $obj->get(\'id\'); } $return = $modx->runProcessor(\'web/remove\', array(\'id\' => $id, \'createdby\' => $modx->user->id), array(\'processors_path\' => $modx->favorites->config[\'processorsPath\']))->response; break; case "ateSearch": if (!$modx->getAuthenticatedUser()) { $return[\'message\'] = $modx->lexicon(\'text_message_no_auth\'); break; } $modx->getService(\'favorites\', \'favorites\', $modx->getOption(\'core_path\') . \'components/favorites/model/favorites/\'); if ($obj = $modx->getObject(\'extFavorites\', array(\'resource_id\' => $post[\'resource_id\'], \'createdby\' => $modx->user->id))) { $id = $obj->get(\'id\'); } $return = array(\'success\' => true, \'message\' => \'\', \'text\' => $modx->pdoTools->runSnippet(\'@FILE snippets/ask_the_expert/getlist.php\', [\'tpl\' => \'@FILE chunks/ask_the_expert/row.tpl\', \'tplAnswer\' => \'@FILE chunks/ask_the_expert/row_answer.tpl\', \'where\' => json_encode([\'status\' => 1, \'private\' => 0, \'ask:LIKE\' => \'%\' . $post[\'query\'] . \'%\']), \'sortby\' => \'closedon\', \'limit\' => 3])); break; } die((is_array($return) ? $modx->toJSON($return) : $return)); } } if ($modx->resource->parent == $modx->getOption(\'page_recipes\') && $modx->getAuthenticatedUser()) { $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); $modx->usersaveinfo->viewCategoryRecipe($modx->resource->id, $modx->user->id); } break; case "OnMODXInit": if ($modx->context->key == "mgr") { return; } $ajax = isset($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && !empty($_SERVER[\'HTTP_X_REQUESTED_WITH\']) && strtolower($_SERVER[\'HTTP_X_REQUESTED_WITH\']) == \'xmlhttprequest\'; if ($ajax) { $modx->lexicon->load(\'core:site\'); } break; case "OnUserSave": $modx->getService(\'usersaveinfo\', \'usersaveinfo\', $modx->getOption(\'core_path\') . \'components/usersaveinfo/model/usersaveinfo/\'); if ($modx->usersaveinfo && $user && $user->get(\'id\')) { $profile = $user->getOne(\'Profile\'); $extended = $profile->get(\'extended\'); if (!is_array($extended)) { $extended = []; } if (isset($extended[\'weight\']) && $extended[\'weight\'] > 0) { $modx->usersaveinfo->addWeight($user->get(\'id\'), $extended[\'weight\']); if ($extended[\'target_weight\'] > $extended[\'weight\']) { $extended[\'target_weight\'] = $extended[\'weight\']; $profile->set(\'extended\', $extended); $profile->save(); } if ($extended[\'target_weight\'] >= $extended[\'weight\']) { $extended = $modx->usersaveinfo->changeMaintenanceWeight($extended, false); $profile->set(\'extended\', $extended); $profile->save(); } } if ($user->get(\'surgery\')) { $extended[\'surgery\'] = $user->get(\'surgery\'); $extended[\'ccg\'] = $user->get(\'ccg\'); } $profile->set(\'extended\', $extended); $profile->save(); } break; }', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '1', 'static_file' => 'plugin.php', ), 39 => array ( 'id' => '39', 'source' => '1', 'property_preprocess' => '0', 'name' => 'controlErrorLog', 'description' => '', 'editor_type' => '0', 'category' => '96', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnManagerPageBeforeRender\': if ($modx->hasPermission(\'error_log_view\')) { $modx->controller->addLexiconTopic(\'controlerrorlog:default\'); $modx->controller->addCss($modx->getOption(\'assets_url\').\'components/controlerrorlog/css/mgr/main.css\'); $modx->controller->addJavascript($modx->getOption(\'assets_url\').\'components/controlerrorlog/js/mgr/cel.default.js\'); $response = $modx->runProcessor(\'mgr/errorlog/get\', array(\'includeContent\'=>false), array(\'processors_path\' => $modx->getOption(\'core_path\') . \'components/controlerrorlog/processors/\')); $resObj = $response->getObject(); $_html = ""; $modx->controller->addHtml($_html); } break; case \'OnHandleRequest\': $email = $modx->getOption(\'controlerrorlog.admin_email\'); if ($modx->context->get(\'key\') == \'mgr\' || empty($email) || !$modx->getOption(\'controlerrorlog.control_frontend\')) return; $f = $modx->getOption(xPDO::OPT_CACHE_PATH) . \'logs/error.log\'; if (file_exists($f)) { $casheHash = $modx->cacheManager->get(\'error_log\'); $hash = md5_file($f); if (filesize($f) > 0 && !empty($casheHash) && $casheHash != $hash) { $modx->lexicon->load(\'controlerrorlog:default\'); /** @var modPHPMailer $mail */ $mail = $modx->getService(\'mail\', \'mail.modPHPMailer\'); $mail->setHTML(true); $mail->set(modMail::MAIL_SUBJECT, $modx->lexicon(\'error_log_email_subject\')); $mail->set(modMail::MAIL_BODY, $modx->lexicon(\'error_log_email_body\', array(\'siteName\' => $modx->config[\'site_name\']))); $mail->set(modMail::MAIL_SENDER, $modx->getOption(\'emailsender\')); $mail->set(modMail::MAIL_FROM, $modx->getOption(\'emailsender\')); $mail->set(modMail::MAIL_FROM_NAME, $modx->getOption(\'site_name\')); $mail->address(\'to\', $email); $mail->address(\'reply-to\', $modx->getOption(\'emailsender\')); if (!$mail->send()) { print (\'An error occurred while trying to send the email: \'.$modx->mail->mailer->ErrorInfo); } $mail->reset(); } if ($casheHash != $hash) { $modx->cacheManager->set(\'error_log\', $hash, 0); } } break; }', 'locked' => '0', 'properties' => NULL, 'disabled' => '0', 'moduleguid' => '', 'static' => '0', 'static_file' => 'core/components/controlerrorlog/elements/plugins/plugin.controlerrorlog.php', ), 40 => array ( 'id' => '40', 'source' => '6', 'property_preprocess' => '0', 'name' => 'tags', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnDocFormSave\': if(!$resource || !$resource->get(\'id\')){ return; } $whereRemove = [ \'resource_id\' => $resource->get(\'id\'), ]; $tv = $modx->getOption(\'tags_tv\'); if ($tv && $tags = $resource->getTVValue((int)$tv)) { $tags = array_map(\'trim\', explode(\' \', $tags)); $ids = []; foreach ($tags as $tag) { if (!$tag = $modx->getObject(\'extTag\', [\'name\' => $tag])) { continue; } $where = [ \'resource_id\' => $resource->get(\'id\'), \'tag_id\' => $tag->get(\'id\'), ]; if (!$obj = $modx->getObject(\'extTagResource\', $where)) { $obj = $modx->newObject(\'extTagResource\'); $obj->fromArray($where); } $obj->save(); $ids[] = $obj->get(\'id\'); } if(count($ids)){ $whereRemove[\'id:NOT IN\'] = $ids; } } $modx->removeCollection(\'extTagResource\', $whereRemove); break; }', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '1', 'static_file' => 'tags.php', ), 41 => array ( 'id' => '41', 'source' => '6', 'property_preprocess' => '0', 'name' => 'print', 'description' => '', 'editor_type' => '0', 'category' => '0', 'cache_type' => '0', 'plugincode' => 'switch ($modx->event->name) { case \'OnLoadWebDocument\': $get = $modx->request->parameters[\'GET\']; if ($get[\'print\']) { $modx->lexicon->load(\'core:print\'); $modx->getService(\'pdoTools\'); $printCommand = \'\'; switch ($get[\'print\']) { case \'template\': $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $echo = \'\'; if ($get[\'id\'] && $obj = $modx->getObject(\'extMPTemplate\', [\'id\' => $get[\'id\']])) { $data = $modx->mealplanner->setTemplate($modx->user->id, $get[\'id\']); if (is_array($data) && count($data)) { foreach ($data as $day => $types) { $rows = $tplTypes = \'\'; if (is_array($types) && count($types)) { foreach ($types as $type => $res) { if (is_array($res) && count($res)) { foreach ($res as $id => $arr) { $rows .= $modx->pdoTools->getChunk(\'@FILE chunks/print/templates/row.tpl\', $arr); } } $tplTypes .= $modx->pdoTools->getChunk(\'@FILE chunks/print/templates/type.tpl\', [\'rows\' => $rows, \'type\' => $type]); } } $tplDay .= $modx->pdoTools->getChunk(\'@FILE chunks/print/templates/day.tpl\', [\'rows\' => $tplTypes, \'day\' => $day]); } } $echo .= $modx->pdoTools->getChunk(\'@FILE chunks/print/templates/page.tpl\', array_merge($obj->toArray(), [\'rows\' => $tplDay, \'print\' => $printCommand])); } break; case \'mealplanner\': $modx->getService(\'mealplanner\', \'mealPlanner\', $modx->getOption(\'core_path\') . \'components/mealplanner/model/mealplanner/\'); $echo = \'\'; $data = $modx->mealplanner->getMP($modx->user->id, $get[\'offset\']); if (is_array($data) && count($data)) { foreach ($data as $day => $types) { $rows = $tplTypes = \'\'; if (is_array($types) && count($types)) { foreach ($types as $type => $res) { if (is_array($res) && count($res)) { foreach ($res as $id => $arr) { $rows .= $modx->pdoTools->getChunk(\'@FILE chunks/print/mealplanner/row.tpl\', $arr); } } $tplTypes .= $modx->pdoTools->getChunk(\'@FILE chunks/print/mealplanner/type.tpl\', [\'rows\' => $rows, \'type\' => $type]); } } $tplDay .= $modx->pdoTools->getChunk(\'@FILE chunks/print/mealplanner/day.tpl\', [\'rows\' => $tplTypes, \'day\' => $day]); } } $echo .= $modx->pdoTools->getChunk(\'@FILE chunks/print/mealplanner/page.tpl\', array_merge([], [\'rows\' => $tplDay, \'print\' => $printCommand])); break; default: return; break; } die($echo); } break; }', 'locked' => '0', 'properties' => 'a:0:{}', 'disabled' => '0', 'moduleguid' => '', 'static' => '1', 'static_file' => 'print.php', ), ), 'policies' => array ( 'modAccessContext' => array ( 'web' => array ( 0 => array ( 'principal' => 0, 'authority' => 9999, 'policy' => array ( 'load' => true, ), ), 1 => array ( 'principal' => 1, 'authority' => 0, 'policy' => array ( 'about' => true, 'access_permissions' => true, 'actions' => true, 'change_password' => true, 'change_profile' => true, 'charsets' => true, 'class_map' => true, 'components' => true, 'content_types' => true, 'countries' => true, 'create' => true, 'credits' => true, 'customize_forms' => true, 'dashboards' => true, 'database' => true, 'database_truncate' => true, 'delete_category' => true, 'delete_chunk' => true, 'delete_context' => true, 'delete_document' => true, 'delete_eventlog' => true, 'delete_plugin' => true, 'delete_propertyset' => true, 'delete_role' => true, 'delete_snippet' => true, 'delete_template' => true, 'delete_tv' => true, 'delete_user' => true, 'directory_chmod' => true, 'directory_create' => true, 'directory_list' => true, 'directory_remove' => true, 'directory_update' => true, 'edit_category' => true, 'edit_chunk' => true, 'edit_context' => true, 'edit_document' => true, 'edit_locked' => true, 'edit_plugin' => true, 'edit_propertyset' => true, 'edit_role' => true, 'edit_snippet' => true, 'edit_template' => true, 'edit_tv' => true, 'edit_user' => true, 'element_tree' => true, 'empty_cache' => true, 'error_log_erase' => true, 'error_log_view' => true, 'export_static' => true, 'file_create' => true, 'file_list' => true, 'file_manager' => true, 'file_remove' => true, 'file_tree' => true, 'file_update' => true, 'file_upload' => true, 'file_unpack' => true, 'file_view' => true, 'flush_sessions' => true, 'frames' => true, 'help' => true, 'home' => true, 'import_static' => true, 'languages' => true, 'lexicons' => true, 'list' => true, 'load' => true, 'logout' => true, 'logs' => true, 'menus' => true, 'menu_reports' => true, 'menu_security' => true, 'menu_site' => true, 'menu_support' => true, 'menu_system' => true, 'menu_tools' => true, 'menu_user' => true, 'messages' => true, 'namespaces' => true, 'new_category' => true, 'new_chunk' => true, 'new_context' => true, 'new_document' => true, 'new_document_in_root' => true, 'new_plugin' => true, 'new_propertyset' => true, 'new_role' => true, 'new_snippet' => true, 'new_static_resource' => true, 'new_symlink' => true, 'new_template' => true, 'new_tv' => true, 'new_user' => true, 'new_weblink' => true, 'packages' => true, 'policy_delete' => true, 'policy_edit' => true, 'policy_new' => true, 'policy_save' => true, 'policy_template_delete' => true, 'policy_template_edit' => true, 'policy_template_new' => true, 'policy_template_save' => true, 'policy_template_view' => true, 'policy_view' => true, 'property_sets' => true, 'providers' => true, 'publish_document' => true, 'purge_deleted' => true, 'remove' => true, 'remove_locks' => true, 'resource_duplicate' => true, 'resourcegroup_delete' => true, 'resourcegroup_edit' => true, 'resourcegroup_new' => true, 'resourcegroup_resource_edit' => true, 'resourcegroup_resource_list' => true, 'resourcegroup_save' => true, 'resourcegroup_view' => true, 'resource_quick_create' => true, 'resource_quick_update' => true, 'resource_tree' => true, 'save' => true, 'save_category' => true, 'save_chunk' => true, 'save_context' => true, 'save_document' => true, 'save_plugin' => true, 'save_propertyset' => true, 'save_role' => true, 'save_snippet' => true, 'save_template' => true, 'save_tv' => true, 'save_user' => true, 'search' => true, 'settings' => true, 'sources' => true, 'source_delete' => true, 'source_edit' => true, 'source_save' => true, 'source_view' => true, 'steal_locks' => true, 'tree_show_element_ids' => true, 'tree_show_resource_ids' => true, 'undelete_document' => true, 'unlock_element_properties' => true, 'unpublish_document' => true, 'usergroup_delete' => true, 'usergroup_edit' => true, 'usergroup_new' => true, 'usergroup_save' => true, 'usergroup_user_edit' => true, 'usergroup_user_list' => true, 'usergroup_view' => true, 'view' => true, 'view_category' => true, 'view_chunk' => true, 'view_context' => true, 'view_document' => true, 'view_element' => true, 'view_eventlog' => true, 'view_offline' => true, 'view_plugin' => true, 'view_propertyset' => true, 'view_role' => true, 'view_snippet' => true, 'view_sysinfo' => true, 'view_template' => true, 'view_tv' => true, 'view_unpublished' => true, 'view_user' => true, 'workspaces' => true, ), ), 2 => array ( 'principal' => 2, 'authority' => 9999, 'policy' => array ( 'load' => true, 'list' => true, 'view' => true, 'save' => true, 'remove' => true, 'copy' => true, 'view_unpublished' => true, ), ), 3 => array ( 'principal' => 3, 'authority' => 9999, 'policy' => array ( 'load' => true, 'list' => true, 'view' => true, 'save' => true, 'remove' => true, 'copy' => true, 'view_unpublished' => true, ), ), 4 => array ( 'principal' => 4, 'authority' => 9999, 'policy' => array ( 'load' => true, 'list' => true, 'view' => true, 'save' => true, 'remove' => true, 'copy' => true, 'view_unpublished' => true, ), ), 5 => array ( 'principal' => 5, 'authority' => 9999, 'policy' => array ( 'load' => true, 'list' => true, 'view' => true, 'save' => true, 'remove' => true, 'copy' => true, 'view_unpublished' => true, ), ), ), ), ), );