template <class T>
struct Base{};
template <class T>
struct B;
template <class T>
struct A: public Base<T>
{
operator B<T>();
};
template <typename T>
B<T> operator*(const Base<T>& s1, const Base<T>& s2){ return B<T>(); }
template <class T>
struct B: public Base<T>
{
A<T> operator[](const B&) { return A<T>(); }
friend B operator* <T>(const Base<T>&, const Base<T>&);
};
template <class T> A<T>::operator B<T>(){ return B<T>(); }
int main()
{
B<int> s1, s2, s3;
s1[s2] * s3;
s1[s2] * s3;
s3 * s1[s2];
s1[s2] * s1[s2];
s3 * s3;
}
dGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBCYXNle307Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IEI7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IEE6IHB1YmxpYyBCYXNlPFQ+CnsKCW9wZXJhdG9yIEI8VD4oKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpCPFQ+IG9wZXJhdG9yKihjb25zdCBCYXNlPFQ+JiBzMSwgY29uc3QgQmFzZTxUPiYgczIpeyByZXR1cm4gQjxUPigpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc3RydWN0IEI6IHB1YmxpYyBCYXNlPFQ+CnsKCUE8VD4gb3BlcmF0b3JbXShjb25zdCBCJikgeyByZXR1cm4gQTxUPigpOyB9CglmcmllbmQgQiBvcGVyYXRvciogPFQ+KGNvbnN0IEJhc2U8VD4mLCBjb25zdCBCYXNlPFQ+Jik7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gQTxUPjo6b3BlcmF0b3IgQjxUPigpeyByZXR1cm4gQjxUPigpOyB9CgppbnQgbWFpbigpCnsKCUI8aW50PiBzMSwgczIsIHMzOwoJczFbczJdICogczM7CglzMVtzMl0gKiBzMzsKCXMzICogczFbczJdOwoJczFbczJdICogczFbczJdOwoJczMgKiBzMzsKfQ==