We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[cirq_web 3D circuit] X**0.5 and Y**0.5 look the same as X and Y
**Description of the issue**

The default look for `X**0.5` and `Y**0.5` look the same as `X` and `Y` in the 3D circuit.

**How to reproduce the issue**

```
import cirq_web
a, b, c, d = cirq.GridQubit.rect(2, 2)
cirq_web.Circuit3D(cirq.Circuit(cirq.X(a)**0.5, cirq.Y(b)**0.5, cirq.X(c), cirq.Y(d))).generate_html_file(
    file_name="hello.html")
```

![image](https://user-images.githubusercontent.com/635073/146627925-5158d61f-670b-41c7-a876-bfa41377fa0a.png)


**Cirq version**
You can get the cirq version by printing `cirq.__version__`. From the command line:

0.13.1


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `cirq-web/cirq_web/circuits/symbols.py`
Content:
```
1 # Copyright 2021 The Cirq Developers
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     https://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 # This is more of a placeholder for now, we can add
16 # official color schemes in follow-ups.
17 import abc
18 import dataclasses
19 from typing import Iterable, List, Optional
20 import cirq
21 
22 
23 @dataclasses.dataclass
24 class SymbolInfo:
25     """Organizes information about a symbol."""
26 
27     labels: List[str]
28     colors: List[str]
29 
30     @staticmethod
31     def unknown_operation(num_qubits: int) -> 'SymbolInfo':
32         """Generates a SymbolInfo object for an unknown operation.
33 
34         Args:
35             num_qubits: the number of qubits in the operation
36         """
37         symbol_info = SymbolInfo([], [])
38         for _ in range(num_qubits):
39             symbol_info.colors.append('gray')
40             symbol_info.labels.append('?')
41         return symbol_info
42 
43 
44 class SymbolResolver(metaclass=abc.ABCMeta):
45     """Abstract class providing the interface for users to specify information
46     about how a particular symbol should be displayed in the 3D circuit
47     """
48 
49     def __call__(self, operation: cirq.Operation) -> Optional[SymbolInfo]:
50         return self.resolve(operation)
51 
52     @abc.abstractmethod
53     def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:
54         """Converts cirq.Operation objects into SymbolInfo objects for serialization."""
55 
56 
57 class DefaultResolver(SymbolResolver):
58     """Default symbol resolver implementation. Takes information
59     from circuit_diagram_info, if unavailable, returns information representing
60     an unknown symbol.
61     """
62 
63     _SYMBOL_COLORS = {
64         '@': 'black',
65         'H': 'yellow',
66         'I': 'orange',
67         'X': 'black',
68         'Y': 'pink',
69         'Z': 'cyan',
70         'S': '#90EE90',
71         'T': '#CBC3E3',
72     }
73 
74     def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:
75         """Checks for the _circuit_diagram_info attribute of the operation,
76         and if it exists, build the symbol information from it. Otherwise,
77         builds symbol info for an unknown operation.
78 
79         Args:
80             operation: the cirq.Operation object to resolve
81         """
82         try:
83             wire_symbols = cirq.circuit_diagram_info(operation).wire_symbols
84         except TypeError:
85             return SymbolInfo.unknown_operation(cirq.num_qubits(operation))
86 
87         symbol_info = SymbolInfo(list(wire_symbols), [])
88         for symbol in wire_symbols:
89             symbol_info.colors.append(DefaultResolver._SYMBOL_COLORS.get(symbol, 'gray'))
90 
91         return symbol_info
92 
93 
94 DEFAULT_SYMBOL_RESOLVERS: Iterable[SymbolResolver] = tuple([DefaultResolver()])
95 
96 
97 def resolve_operation(operation: cirq.Operation, resolvers: Iterable[SymbolResolver]) -> SymbolInfo:
98     """Builds a SymbolInfo object based off of a designated operation
99     and list of resolvers. The latest resolver takes precendent.
100 
101     Args:
102         operation: the cirq.Operation object to resolve
103         resolvers: a list of SymbolResolvers which provides instructions
104         on how to build SymbolInfo objects.
105 
106     Raises:
107         ValueError: if the operation cannot be resolved into a symbol.
108     """
109     symbol_info = None
110     for resolver in resolvers:
111         info = resolver(operation)
112         if info is not None:
113             symbol_info = info
114 
115     if symbol_info is None:
116         raise ValueError(f'Cannot resolve operation: {operation}')
117     return symbol_info
118 
119 
120 class Operation3DSymbol:
121     def __init__(self, wire_symbols, location_info, color_info, moment):
122         """Gathers symbol information from an operation and builds an
123         object to represent it in 3D.
124 
125         Args:
126             wire_symbols: a list of symbols taken from circuit_diagram_info()
127             that will be used to represent the operation in the 3D circuit.
128 
129             location_info: A list of coordinates for each wire_symbol. The
130             index of the coordinate tuple in the location_info list must
131             correspond with the index of the symbol in the wire_symbols list.
132 
133             color_info: a list representing the desired color of the symbol(s).
134             These will also correspond to index of the symbol in the
135             wire_symbols list.
136 
137             moment: the moment where the symbol should be.
138         """
139         self.wire_symbols = wire_symbols
140         self.location_info = location_info
141         self.color_info = color_info
142         self.moment = moment
143 
144     def to_typescript(self):
145         return {
146             'wire_symbols': list(self.wire_symbols),
147             'location_info': self.location_info,
148             'color_info': self.color_info,
149             'moment': self.moment,
150         }
151
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/cirq-web/cirq_web/circuits/symbols.py b/cirq-web/cirq_web/circuits/symbols.py
--- a/cirq-web/cirq_web/circuits/symbols.py
+++ b/cirq-web/cirq_web/circuits/symbols.py
@@ -18,6 +18,7 @@
 import dataclasses
 from typing import Iterable, List, Optional
 import cirq
+from cirq.protocols.circuit_diagram_info_protocol import CircuitDiagramInfoArgs
 
 
 @dataclasses.dataclass
@@ -80,11 +81,15 @@
             operation: the cirq.Operation object to resolve
         """
         try:
-            wire_symbols = cirq.circuit_diagram_info(operation).wire_symbols
+            info = cirq.circuit_diagram_info(operation)
         except TypeError:
             return SymbolInfo.unknown_operation(cirq.num_qubits(operation))
 
-        symbol_info = SymbolInfo(list(wire_symbols), [])
+        wire_symbols = info.wire_symbols
+        symbol_exponent = info._wire_symbols_including_formatted_exponent(
+            CircuitDiagramInfoArgs.UNINFORMED_DEFAULT
+        )
+        symbol_info = SymbolInfo(list(symbol_exponent), [])
         for symbol in wire_symbols:
             symbol_info.colors.append(DefaultResolver._SYMBOL_COLORS.get(symbol, 'gray'))

{"golden_diff": "diff --git a/cirq-web/cirq_web/circuits/symbols.py b/cirq-web/cirq_web/circuits/symbols.py\n--- a/cirq-web/cirq_web/circuits/symbols.py\n+++ b/cirq-web/cirq_web/circuits/symbols.py\n@@ -18,6 +18,7 @@\n import dataclasses\n from typing import Iterable, List, Optional\n import cirq\n+from cirq.protocols.circuit_diagram_info_protocol import CircuitDiagramInfoArgs\n \n \n @dataclasses.dataclass\n@@ -80,11 +81,15 @@\n             operation: the cirq.Operation object to resolve\n         \"\"\"\n         try:\n-            wire_symbols = cirq.circuit_diagram_info(operation).wire_symbols\n+            info = cirq.circuit_diagram_info(operation)\n         except TypeError:\n             return SymbolInfo.unknown_operation(cirq.num_qubits(operation))\n \n-        symbol_info = SymbolInfo(list(wire_symbols), [])\n+        wire_symbols = info.wire_symbols\n+        symbol_exponent = info._wire_symbols_including_formatted_exponent(\n+            CircuitDiagramInfoArgs.UNINFORMED_DEFAULT\n+        )\n+        symbol_info = SymbolInfo(list(symbol_exponent), [])\n         for symbol in wire_symbols:\n             symbol_info.colors.append(DefaultResolver._SYMBOL_COLORS.get(symbol, 'gray'))\n", "issue": "[cirq_web 3D circuit] X**0.5 and Y**0.5 look the same as X and Y\n**Description of the issue**\r\n\r\nThe default look for `X**0.5` and `Y**0.5` look the same as `X` and `Y` in the 3D circuit.\r\n\r\n**How to reproduce the issue**\r\n\r\n```\r\nimport cirq_web\r\na, b, c, d = cirq.GridQubit.rect(2, 2)\r\ncirq_web.Circuit3D(cirq.Circuit(cirq.X(a)**0.5, cirq.Y(b)**0.5, cirq.X(c), cirq.Y(d))).generate_html_file(\r\n    file_name=\"hello.html\")\r\n```\r\n\r\n![image](https://user-images.githubusercontent.com/635073/146627925-5158d61f-670b-41c7-a876-bfa41377fa0a.png)\r\n\r\n\r\n**Cirq version**\r\nYou can get the cirq version by printing `cirq.__version__`. From the command line:\r\n\r\n0.13.1\r\n\n", "before_files": [{"content": "# Copyright 2021 The Cirq Developers\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This is more of a placeholder for now, we can add\n# official color schemes in follow-ups.\nimport abc\nimport dataclasses\nfrom typing import Iterable, List, Optional\nimport cirq\n\n\n@dataclasses.dataclass\nclass SymbolInfo:\n    \"\"\"Organizes information about a symbol.\"\"\"\n\n    labels: List[str]\n    colors: List[str]\n\n    @staticmethod\n    def unknown_operation(num_qubits: int) -> 'SymbolInfo':\n        \"\"\"Generates a SymbolInfo object for an unknown operation.\n\n        Args:\n            num_qubits: the number of qubits in the operation\n        \"\"\"\n        symbol_info = SymbolInfo([], [])\n        for _ in range(num_qubits):\n            symbol_info.colors.append('gray')\n            symbol_info.labels.append('?')\n        return symbol_info\n\n\nclass SymbolResolver(metaclass=abc.ABCMeta):\n    \"\"\"Abstract class providing the interface for users to specify information\n    about how a particular symbol should be displayed in the 3D circuit\n    \"\"\"\n\n    def __call__(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        return self.resolve(operation)\n\n    @abc.abstractmethod\n    def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        \"\"\"Converts cirq.Operation objects into SymbolInfo objects for serialization.\"\"\"\n\n\nclass DefaultResolver(SymbolResolver):\n    \"\"\"Default symbol resolver implementation. Takes information\n    from circuit_diagram_info, if unavailable, returns information representing\n    an unknown symbol.\n    \"\"\"\n\n    _SYMBOL_COLORS = {\n        '@': 'black',\n        'H': 'yellow',\n        'I': 'orange',\n        'X': 'black',\n        'Y': 'pink',\n        'Z': 'cyan',\n        'S': '#90EE90',\n        'T': '#CBC3E3',\n    }\n\n    def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        \"\"\"Checks for the _circuit_diagram_info attribute of the operation,\n        and if it exists, build the symbol information from it. Otherwise,\n        builds symbol info for an unknown operation.\n\n        Args:\n            operation: the cirq.Operation object to resolve\n        \"\"\"\n        try:\n            wire_symbols = cirq.circuit_diagram_info(operation).wire_symbols\n        except TypeError:\n            return SymbolInfo.unknown_operation(cirq.num_qubits(operation))\n\n        symbol_info = SymbolInfo(list(wire_symbols), [])\n        for symbol in wire_symbols:\n            symbol_info.colors.append(DefaultResolver._SYMBOL_COLORS.get(symbol, 'gray'))\n\n        return symbol_info\n\n\nDEFAULT_SYMBOL_RESOLVERS: Iterable[SymbolResolver] = tuple([DefaultResolver()])\n\n\ndef resolve_operation(operation: cirq.Operation, resolvers: Iterable[SymbolResolver]) -> SymbolInfo:\n    \"\"\"Builds a SymbolInfo object based off of a designated operation\n    and list of resolvers. The latest resolver takes precendent.\n\n    Args:\n        operation: the cirq.Operation object to resolve\n        resolvers: a list of SymbolResolvers which provides instructions\n        on how to build SymbolInfo objects.\n\n    Raises:\n        ValueError: if the operation cannot be resolved into a symbol.\n    \"\"\"\n    symbol_info = None\n    for resolver in resolvers:\n        info = resolver(operation)\n        if info is not None:\n            symbol_info = info\n\n    if symbol_info is None:\n        raise ValueError(f'Cannot resolve operation: {operation}')\n    return symbol_info\n\n\nclass Operation3DSymbol:\n    def __init__(self, wire_symbols, location_info, color_info, moment):\n        \"\"\"Gathers symbol information from an operation and builds an\n        object to represent it in 3D.\n\n        Args:\n            wire_symbols: a list of symbols taken from circuit_diagram_info()\n            that will be used to represent the operation in the 3D circuit.\n\n            location_info: A list of coordinates for each wire_symbol. The\n            index of the coordinate tuple in the location_info list must\n            correspond with the index of the symbol in the wire_symbols list.\n\n            color_info: a list representing the desired color of the symbol(s).\n            These will also correspond to index of the symbol in the\n            wire_symbols list.\n\n            moment: the moment where the symbol should be.\n        \"\"\"\n        self.wire_symbols = wire_symbols\n        self.location_info = location_info\n        self.color_info = color_info\n        self.moment = moment\n\n    def to_typescript(self):\n        return {\n            'wire_symbols': list(self.wire_symbols),\n            'location_info': self.location_info,\n            'color_info': self.color_info,\n            'moment': self.moment,\n        }\n", "path": "cirq-web/cirq_web/circuits/symbols.py"}], "after_files": [{"content": "# Copyright 2021 The Cirq Developers\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This is more of a placeholder for now, we can add\n# official color schemes in follow-ups.\nimport abc\nimport dataclasses\nfrom typing import Iterable, List, Optional\nimport cirq\nfrom cirq.protocols.circuit_diagram_info_protocol import CircuitDiagramInfoArgs\n\n\n@dataclasses.dataclass\nclass SymbolInfo:\n    \"\"\"Organizes information about a symbol.\"\"\"\n\n    labels: List[str]\n    colors: List[str]\n\n    @staticmethod\n    def unknown_operation(num_qubits: int) -> 'SymbolInfo':\n        \"\"\"Generates a SymbolInfo object for an unknown operation.\n\n        Args:\n            num_qubits: the number of qubits in the operation\n        \"\"\"\n        symbol_info = SymbolInfo([], [])\n        for _ in range(num_qubits):\n            symbol_info.colors.append('gray')\n            symbol_info.labels.append('?')\n        return symbol_info\n\n\nclass SymbolResolver(metaclass=abc.ABCMeta):\n    \"\"\"Abstract class providing the interface for users to specify information\n    about how a particular symbol should be displayed in the 3D circuit\n    \"\"\"\n\n    def __call__(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        return self.resolve(operation)\n\n    @abc.abstractmethod\n    def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        \"\"\"Converts cirq.Operation objects into SymbolInfo objects for serialization.\"\"\"\n\n\nclass DefaultResolver(SymbolResolver):\n    \"\"\"Default symbol resolver implementation. Takes information\n    from circuit_diagram_info, if unavailable, returns information representing\n    an unknown symbol.\n    \"\"\"\n\n    _SYMBOL_COLORS = {\n        '@': 'black',\n        'H': 'yellow',\n        'I': 'orange',\n        'X': 'black',\n        'Y': 'pink',\n        'Z': 'cyan',\n        'S': '#90EE90',\n        'T': '#CBC3E3',\n    }\n\n    def resolve(self, operation: cirq.Operation) -> Optional[SymbolInfo]:\n        \"\"\"Checks for the _circuit_diagram_info attribute of the operation,\n        and if it exists, build the symbol information from it. Otherwise,\n        builds symbol info for an unknown operation.\n\n        Args:\n            operation: the cirq.Operation object to resolve\n        \"\"\"\n        try:\n            info = cirq.circuit_diagram_info(operation)\n        except TypeError:\n            return SymbolInfo.unknown_operation(cirq.num_qubits(operation))\n\n        wire_symbols = info.wire_symbols\n        symbol_exponent = info._wire_symbols_including_formatted_exponent(\n            CircuitDiagramInfoArgs.UNINFORMED_DEFAULT\n        )\n        symbol_info = SymbolInfo(list(symbol_exponent), [])\n        for symbol in wire_symbols:\n            symbol_info.colors.append(DefaultResolver._SYMBOL_COLORS.get(symbol, 'gray'))\n\n        return symbol_info\n\n\nDEFAULT_SYMBOL_RESOLVERS: Iterable[SymbolResolver] = tuple([DefaultResolver()])\n\n\ndef resolve_operation(operation: cirq.Operation, resolvers: Iterable[SymbolResolver]) -> SymbolInfo:\n    \"\"\"Builds a SymbolInfo object based off of a designated operation\n    and list of resolvers. The latest resolver takes precendent.\n\n    Args:\n        operation: the cirq.Operation object to resolve\n        resolvers: a list of SymbolResolvers which provides instructions\n        on how to build SymbolInfo objects.\n\n    Raises:\n        ValueError: if the operation cannot be resolved into a symbol.\n    \"\"\"\n    symbol_info = None\n    for resolver in resolvers:\n        info = resolver(operation)\n        if info is not None:\n            symbol_info = info\n\n    if symbol_info is None:\n        raise ValueError(f'Cannot resolve operation: {operation}')\n    return symbol_info\n\n\nclass Operation3DSymbol:\n    def __init__(self, wire_symbols, location_info, color_info, moment):\n        \"\"\"Gathers symbol information from an operation and builds an\n        object to represent it in 3D.\n\n        Args:\n            wire_symbols: a list of symbols taken from circuit_diagram_info()\n            that will be used to represent the operation in the 3D circuit.\n\n            location_info: A list of coordinates for each wire_symbol. The\n            index of the coordinate tuple in the location_info list must\n            correspond with the index of the symbol in the wire_symbols list.\n\n            color_info: a list representing the desired color of the symbol(s).\n            These will also correspond to index of the symbol in the\n            wire_symbols list.\n\n            moment: the moment where the symbol should be.\n        \"\"\"\n        self.wire_symbols = wire_symbols\n        self.location_info = location_info\n        self.color_info = color_info\n        self.moment = moment\n\n    def to_typescript(self):\n        return {\n            'wire_symbols': list(self.wire_symbols),\n            'location_info': self.location_info,\n            'color_info': self.color_info,\n            'moment': self.moment,\n        }\n", "path": "cirq-web/cirq_web/circuits/symbols.py"}]}