#define furrovineexport
template<class T>
class TVector2;
template<class T>
class TVector3;
template<class T>
class TVector4;
template<class T, unsigned one, unsigned two>
struct furrovineexport swizzler_two {
T v[4];
swizzler_two & operator= (const TVector2<T>& right) {
v[one] = right.x;
v[two] = right.y;
return *this;
}
operator TVector3<T> () const { return TVector4<T>(v[one], v[two]); }
};
template<class T, unsigned one, unsigned two, unsigned three>
struct furrovineexport swizzler_three {
T v[4];
swizzler_three& operator= (const TVector3<T>& right) {
v[one] = right.x;
v[two] = right.y;
v[three] = right.z;
return *this;
}
operator TVector3<T> () const { return TVector4<T>(v[one], v[two], v[three]); }
};
template<class T, unsigned one, unsigned two, unsigned three, unsigned four>
struct furrovineexport swizzler_four {
T v[4];
operator TVector4<T> () const { return TVector4<T>(v[one], v[two], v[three], v[four]); }
};
int main() {}
I2RlZmluZSBmdXJyb3ZpbmVleHBvcnQgCgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBUVmVjdG9yMjsKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVFZlY3RvcjM7CnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFRWZWN0b3I0OwoKdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgb25lLCB1bnNpZ25lZCB0d28+CnN0cnVjdCBmdXJyb3ZpbmVleHBvcnQgc3dpenpsZXJfdHdvIHsKICAgIFQgdls0XTsgCiAgICBzd2l6emxlcl90d28gJiBvcGVyYXRvcj0gKGNvbnN0IFRWZWN0b3IyPFQ+JiByaWdodCkgewogICAgICAgIHZbb25lXSA9IHJpZ2h0Lng7CiAgICAgICAgdlt0d29dID0gcmlnaHQueTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBvcGVyYXRvciBUVmVjdG9yMzxUPiAoKSBjb25zdCB7IHJldHVybiBUVmVjdG9yNDxUPih2W29uZV0sIHZbdHdvXSk7IH0KfTsKdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgb25lLCB1bnNpZ25lZCB0d28sIHVuc2lnbmVkIHRocmVlPgpzdHJ1Y3QgZnVycm92aW5lZXhwb3J0IHN3aXp6bGVyX3RocmVlIHsKICAgIFQgdls0XTsgCiAgICBzd2l6emxlcl90aHJlZSYgb3BlcmF0b3I9IChjb25zdCBUVmVjdG9yMzxUPiYgcmlnaHQpIHsKICAgICAgICB2W29uZV0gPSByaWdodC54OwogICAgICAgIHZbdHdvXSA9IHJpZ2h0Lnk7CiAgICAgICAgdlt0aHJlZV0gPSByaWdodC56OwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIG9wZXJhdG9yIFRWZWN0b3IzPFQ+ICgpIGNvbnN0IHsgcmV0dXJuIFRWZWN0b3I0PFQ+KHZbb25lXSwgdlt0d29dLCB2W3RocmVlXSk7IH0KfTsKdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgb25lLCB1bnNpZ25lZCB0d28sIHVuc2lnbmVkIHRocmVlLCB1bnNpZ25lZCBmb3VyPgpzdHJ1Y3QgZnVycm92aW5lZXhwb3J0IHN3aXp6bGVyX2ZvdXIgewogICAgVCB2WzRdOyAKICAgIG9wZXJhdG9yIFRWZWN0b3I0PFQ+ICgpIGNvbnN0IHsgcmV0dXJuIFRWZWN0b3I0PFQ+KHZbb25lXSwgdlt0d29dLCB2W3RocmVlXSwgdltmb3VyXSk7IH0KfTsKCmludCBtYWluKCkge30KICAgIA==