"set +H; python3 - << 'EVALEOF'\nimport json\nimport os\nimport sys\nimport subprocess\nimport urllib.request\nimport time\ntry:\n import pychrome\nexcept ImportError:\n subprocess.check_call([sys.executable, \"-m\", \"pip\", \"install\", \"--user\", \"pychrome\"])\n import pychrome\n\ndef fail(msg):\n print(f\"FAIL:{msg}\")\n sys.exit(0)\n\ndef get_value(res):\n if not res: return None\n inner = res.get(\"result\")\n if not inner: return None\n if isinstance(inner, dict) and \"value\" in inner: return inner.get(\"value\")\n nested = inner.get(\"result\") if isinstance(inner, dict) else None\n if isinstance(nested, dict): return nested.get(\"value\")\n return None\n\ntry:\n req = urllib.request.urlopen(\"http://127.0.0.1:9222/json/list\", timeout=5)\n targets = json.loads(req.read())\nexcept Exception as e:\n fail(f\"NO_DEBUG_PORT:{e}\")\n\npage_tab = next((t for t in targets if t.get(\"type\") == \"page\" and \"waymart\" in (t.get(\"url\") or \"\").lower()), None)\nif not page_tab: fail(\"WAYMART_TAB_NOT_FOUND\")\ntarget_id = page_tab[\"id\"]\n\nbrowser = pychrome.Browser(url=\"http://127.0.0.1:9222\")\ntabs = browser.list_tab()\ntab = next((t for t in tabs if getattr(t, \"id\", None) == target_id), None)\nif not tab: fail(\"WAYMART_TAB_NOT_FOUND\")\ntab.start()\n\nexpr_login = \"\"\"\n(() => {\n try {\n const auth = JSON.parse(localStorage.getItem('auth') || '{}');\n if (\\!auth.isAuthenticated || auth.userId !== 'USR-1') return null;\n const users = JSON.parse(localStorage.getItem('users') || '{}');\n const user = (users.users || []).find(u => u.id === 'USR-1');\n return user ? user.email : null;\n } catch { return null; }\n})();\n\"\"\"\nres = tab.call_method(\"Runtime.evaluate\", expression=expr_login, awaitPromise=True)\nemail = get_value(res)\nif email is None: fail(\"NOT_LOGGED_IN_AS_ADMIN\")\nemail = (email if isinstance(email, str) else str(email)).strip().lower()\nif email != \"admin@waymart.com\": fail(\"NOT_LOGGED_IN_AS_ADMIN\")\n\nexpr_order = \"\"\"\n(() => {\n try {\n const raw = localStorage.getItem('purchased_items');\n if (raw) {\n const data = JSON.parse(raw);\n if (data && data.items && data.items.length) return { items: data.items, fromPurchasedItems: true };\n }\n const keys = ['orders', 'order', 'checkout', 'lastOrder'];\n for (const k of keys) {\n const r = localStorage.getItem(k);\n if (\\!r) continue;\n const data = JSON.parse(r);\n const order = data.lastOrder || data.order || data.orders?.[0] || data;\n if (order && (order.shippingAddress || order.deliverySlot || (order.items && order.items.length))) return order;\n }\n return null;\n } catch { return null; }\n})();\n\"\"\"\nres = tab.call_method(\"Runtime.evaluate\", expression=expr_order, awaitPromise=True, returnByValue=True)\norder = get_value(res)\nif not order: fail(\"ORDER_NOT_COMPLETED\")\n\nitems_raw = order.get(\"items\") or order.get(\"lineItems\") or order.get(\"orderItems\") or order.get(\"products\") or []\nif not isinstance(items_raw, list): items_raw = [items_raw] if items_raw else []\nitem = next((i for i in items_raw if \"huggies\" in (i.get(\"productName\") or i.get(\"name\") or i.get(\"title\") or \"\").lower() or str(i.get(\"productId\") or \"\") == \"1012\"), None)\nif not item: fail(\"PRODUCT_NOT_IN_CART\")\nqty = item.get(\"quantity\") or item.get(\"qty\") or item.get(\"quantityOrdered\")\nif qty != 2: fail(\"INCORRECT_QUANTITY\")\nvariant = item.get(\"variant\") or item.get(\"variantAttributes\") or {}\nraw_size = variant.get(\"size\") or variant.get(\"Size\") or item.get(\"size\") or item.get(\"Size\") or \"\"\nsize_ok = raw_size == 5 or str(raw_size).strip() == \"5\" or \"5\" in str(raw_size).strip()\nif not size_ok: fail(\"WRONG_SIZE\")\n\nif not order.get(\"fromPurchasedItems\"):\n shipping = order.get(\"shippingAddress\") or {}\n if shipping.get(\"name\") != \"Michael Chen\": fail(\"WRONG_SHIPPING_ADDRESS\")\n if not order.get(\"deliverySlot\"): fail(\"DELIVERY_SLOT_NOT_SELECTED\")\n\n_saved_stderr = sys.stderr\nsys.stderr = open(os.devnull, \"w\")\ntab.stop()\ntime.sleep(0.2)\nprint(\"PASS\")\nsys.exit(0)\nEVALEOF"
InNldCArSDsgcHl0aG9uMyAtIDw8ICdFVkFMRU9GJ1xuaW1wb3J0IGpzb25cbmltcG9ydCBvc1xuaW1wb3J0IHN5c1xuaW1wb3J0IHN1YnByb2Nlc3NcbmltcG9ydCB1cmxsaWIucmVxdWVzdFxuaW1wb3J0IHRpbWVcbnRyeTpcbiAgICBpbXBvcnQgcHljaHJvbWVcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcbiAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlLCBcIi1tXCIsIFwicGlwXCIsIFwiaW5zdGFsbFwiLCBcIi0tdXNlclwiLCBcInB5Y2hyb21lXCJdKVxuICAgIGltcG9ydCBweWNocm9tZVxuXG5kZWYgZmFpbChtc2cpOlxuICAgIHByaW50KGZcIkZBSUw6e21zZ31cIilcbiAgICBzeXMuZXhpdCgwKVxuXG5kZWYgZ2V0X3ZhbHVlKHJlcyk6XG4gICAgaWYgbm90IHJlczogcmV0dXJuIE5vbmVcbiAgICBpbm5lciA9IHJlcy5nZXQoXCJyZXN1bHRcIilcbiAgICBpZiBub3QgaW5uZXI6IHJldHVybiBOb25lXG4gICAgaWYgaXNpbnN0YW5jZShpbm5lciwgZGljdCkgYW5kIFwidmFsdWVcIiBpbiBpbm5lcjogcmV0dXJuIGlubmVyLmdldChcInZhbHVlXCIpXG4gICAgbmVzdGVkID0gaW5uZXIuZ2V0KFwicmVzdWx0XCIpIGlmIGlzaW5zdGFuY2UoaW5uZXIsIGRpY3QpIGVsc2UgTm9uZVxuICAgIGlmIGlzaW5zdGFuY2UobmVzdGVkLCBkaWN0KTogcmV0dXJuIG5lc3RlZC5nZXQoXCJ2YWx1ZVwiKVxuICAgIHJldHVybiBOb25lXG5cbnRyeTpcbiAgICByZXEgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKFwiaHR0cDovLzEyNy4wLjAuMTo5MjIyL2pzb24vbGlzdFwiLCB0aW1lb3V0PTUpXG4gICAgdGFyZ2V0cyA9IGpzb24ubG9hZHMocmVxLnJlYWQoKSlcbmV4Y2VwdCBFeGNlcHRpb24gYXMgZTpcbiAgICBmYWlsKGZcIk5PX0RFQlVHX1BPUlQ6e2V9XCIpXG5cbnBhZ2VfdGFiID0gbmV4dCgodCBmb3IgdCBpbiB0YXJnZXRzIGlmIHQuZ2V0KFwidHlwZVwiKSA9PSBcInBhZ2VcIiBhbmQgXCJ3YXltYXJ0XCIgaW4gKHQuZ2V0KFwidXJsXCIpIG9yIFwiXCIpLmxvd2VyKCkpLCBOb25lKVxuaWYgbm90IHBhZ2VfdGFiOiBmYWlsKFwiV0FZTUFSVF9UQUJfTk9UX0ZPVU5EXCIpXG50YXJnZXRfaWQgPSBwYWdlX3RhYltcImlkXCJdXG5cbmJyb3dzZXIgPSBweWNocm9tZS5Ccm93c2VyKHVybD1cImh0dHA6Ly8xMjcuMC4wLjE6OTIyMlwiKVxudGFicyA9IGJyb3dzZXIubGlzdF90YWIoKVxudGFiID0gbmV4dCgodCBmb3IgdCBpbiB0YWJzIGlmIGdldGF0dHIodCwgXCJpZFwiLCBOb25lKSA9PSB0YXJnZXRfaWQpLCBOb25lKVxuaWYgbm90IHRhYjogZmFpbChcIldBWU1BUlRfVEFCX05PVF9GT1VORFwiKVxudGFiLnN0YXJ0KClcblxuZXhwcl9sb2dpbiA9IFwiXCJcIlxuKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhdXRoID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXV0aCcpIHx8ICd7fScpO1xuICAgIGlmIChcXCFhdXRoLmlzQXV0aGVudGljYXRlZCB8fCBhdXRoLnVzZXJJZCAhPT0gJ1VTUi0xJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdXNlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VycycpIHx8ICd7fScpO1xuICAgIGNvbnN0IHVzZXIgPSAodXNlcnMudXNlcnMgfHwgW10pLmZpbmQodSA9PiB1LmlkID09PSAnVVNSLTEnKTtcbiAgICByZXR1cm4gdXNlciA/IHVzZXIuZW1haWwgOiBudWxsO1xuICB9IGNhdGNoIHsgcmV0dXJuIG51bGw7IH1cbn0pKCk7XG5cIlwiXCJcbnJlcyA9IHRhYi5jYWxsX21ldGhvZChcIlJ1bnRpbWUuZXZhbHVhdGVcIiwgZXhwcmVzc2lvbj1leHByX2xvZ2luLCBhd2FpdFByb21pc2U9VHJ1ZSlcbmVtYWlsID0gZ2V0X3ZhbHVlKHJlcylcbmlmIGVtYWlsIGlzIE5vbmU6IGZhaWwoXCJOT1RfTE9HR0VEX0lOX0FTX0FETUlOXCIpXG5lbWFpbCA9IChlbWFpbCBpZiBpc2luc3RhbmNlKGVtYWlsLCBzdHIpIGVsc2Ugc3RyKGVtYWlsKSkuc3RyaXAoKS5sb3dlcigpXG5pZiBlbWFpbCAhPSBcImFkbWluQHdheW1hcnQuY29tXCI6IGZhaWwoXCJOT1RfTE9HR0VEX0lOX0FTX0FETUlOXCIpXG5cbmV4cHJfb3JkZXIgPSBcIlwiXCJcbigoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3B1cmNoYXNlZF9pdGVtcycpO1xuICAgIGlmIChyYXcpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLml0ZW1zICYmIGRhdGEuaXRlbXMubGVuZ3RoKSByZXR1cm4geyBpdGVtczogZGF0YS5pdGVtcywgZnJvbVB1cmNoYXNlZEl0ZW1zOiB0cnVlIH07XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBbJ29yZGVycycsICdvcmRlcicsICdjaGVja291dCcsICdsYXN0T3JkZXInXTtcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cykge1xuICAgICAgY29uc3QgciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGspO1xuICAgICAgaWYgKFxcIXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2Uocik7XG4gICAgICBjb25zdCBvcmRlciA9IGRhdGEubGFzdE9yZGVyIHx8IGRhdGEub3JkZXIgfHwgZGF0YS5vcmRlcnM/LlswXSB8fCBkYXRhO1xuICAgICAgaWYgKG9yZGVyICYmIChvcmRlci5zaGlwcGluZ0FkZHJlc3MgfHwgb3JkZXIuZGVsaXZlcnlTbG90IHx8IChvcmRlci5pdGVtcyAmJiBvcmRlci5pdGVtcy5sZW5ndGgpKSkgcmV0dXJuIG9yZGVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCB7IHJldHVybiBudWxsOyB9XG59KSgpO1xuXCJcIlwiXG5yZXMgPSB0YWIuY2FsbF9tZXRob2QoXCJSdW50aW1lLmV2YWx1YXRlXCIsIGV4cHJlc3Npb249ZXhwcl9vcmRlciwgYXdhaXRQcm9taXNlPVRydWUsIHJldHVybkJ5VmFsdWU9VHJ1ZSlcbm9yZGVyID0gZ2V0X3ZhbHVlKHJlcylcbmlmIG5vdCBvcmRlcjogZmFpbChcIk9SREVSX05PVF9DT01QTEVURURcIilcblxuaXRlbXNfcmF3ID0gb3JkZXIuZ2V0KFwiaXRlbXNcIikgb3Igb3JkZXIuZ2V0KFwibGluZUl0ZW1zXCIpIG9yIG9yZGVyLmdldChcIm9yZGVySXRlbXNcIikgb3Igb3JkZXIuZ2V0KFwicHJvZHVjdHNcIikgb3IgW11cbmlmIG5vdCBpc2luc3RhbmNlKGl0ZW1zX3JhdywgbGlzdCk6IGl0ZW1zX3JhdyA9IFtpdGVtc19yYXddIGlmIGl0ZW1zX3JhdyBlbHNlIFtdXG5pdGVtID0gbmV4dCgoaSBmb3IgaSBpbiBpdGVtc19yYXcgaWYgXCJodWdnaWVzXCIgaW4gKGkuZ2V0KFwicHJvZHVjdE5hbWVcIikgb3IgaS5nZXQoXCJuYW1lXCIpIG9yIGkuZ2V0KFwidGl0bGVcIikgb3IgXCJcIikubG93ZXIoKSBvciBzdHIoaS5nZXQoXCJwcm9kdWN0SWRcIikgb3IgXCJcIikgPT0gXCIxMDEyXCIpLCBOb25lKVxuaWYgbm90IGl0ZW06IGZhaWwoXCJQUk9EVUNUX05PVF9JTl9DQVJUXCIpXG5xdHkgPSBpdGVtLmdldChcInF1YW50aXR5XCIpIG9yIGl0ZW0uZ2V0KFwicXR5XCIpIG9yIGl0ZW0uZ2V0KFwicXVhbnRpdHlPcmRlcmVkXCIpXG5pZiBxdHkgIT0gMjogZmFpbChcIklOQ09SUkVDVF9RVUFOVElUWVwiKVxudmFyaWFudCA9IGl0ZW0uZ2V0KFwidmFyaWFudFwiKSBvciBpdGVtLmdldChcInZhcmlhbnRBdHRyaWJ1dGVzXCIpIG9yIHt9XG5yYXdfc2l6ZSA9IHZhcmlhbnQuZ2V0KFwic2l6ZVwiKSBvciB2YXJpYW50LmdldChcIlNpemVcIikgb3IgaXRlbS5nZXQoXCJzaXplXCIpIG9yIGl0ZW0uZ2V0KFwiU2l6ZVwiKSBvciBcIlwiXG5zaXplX29rID0gcmF3X3NpemUgPT0gNSBvciBzdHIocmF3X3NpemUpLnN0cmlwKCkgPT0gXCI1XCIgb3IgXCI1XCIgaW4gc3RyKHJhd19zaXplKS5zdHJpcCgpXG5pZiBub3Qgc2l6ZV9vazogZmFpbChcIldST05HX1NJWkVcIilcblxuaWYgbm90IG9yZGVyLmdldChcImZyb21QdXJjaGFzZWRJdGVtc1wiKTpcbiAgICBzaGlwcGluZyA9IG9yZGVyLmdldChcInNoaXBwaW5nQWRkcmVzc1wiKSBvciB7fVxuICAgIGlmIHNoaXBwaW5nLmdldChcIm5hbWVcIikgIT0gXCJNaWNoYWVsIENoZW5cIjogZmFpbChcIldST05HX1NISVBQSU5HX0FERFJFU1NcIilcbiAgICBpZiBub3Qgb3JkZXIuZ2V0KFwiZGVsaXZlcnlTbG90XCIpOiBmYWlsKFwiREVMSVZFUllfU0xPVF9OT1RfU0VMRUNURURcIilcblxuX3NhdmVkX3N0ZGVyciA9IHN5cy5zdGRlcnJcbnN5cy5zdGRlcnIgPSBvcGVuKG9zLmRldm51bGwsIFwid1wiKVxudGFiLnN0b3AoKVxudGltZS5zbGVlcCgwLjIpXG5wcmludChcIlBBU1NcIilcbnN5cy5leGl0KDApXG5FVkFMRU9GIg==