// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll long long
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#define fi first
#define se second
#define M 1000000007
#define MAXN 100001
#define GIOIHAN 1000001
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 311
#define NAME "check"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); // dùng để nén sort mảng compare
using namespace std;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n ;
ll tour[MAXN] ;
ll par[MAXN] ;
ll fin[MAXN] ;
ll st[MAXN] ;
ll high[MAXN] ;
ll sz[MAXN] ;
ll chainHead[MAXN] ;
ll chainID[MAXN] ;
ll NodeVal[MAXN] ;
ll curchain = 1 ;
ll timedfs =0 ;
vector<ll>adj[MAXN] ;
//**Struct**//
struct E {
ll u, v, w;
};
vector<E> edge ;
struct Seg {
struct Data {
ll mi, ma ;
};
Data val[MAXN << 2 ] ;
ll lazy[MAXN<<2 ] ;
void resett() {
for(ll i = 0 ; i <(MAXN <<2 ) ; i ++ ) {
val[i].ma = INT_MIN;val[i]. mi = INT_MAX ;
}
memset(lazy, 0, sizeof lazy ) ;
}
Data Merge(Data a, Data b ) {
Data res ;
res.ma = max(a.ma, b.ma ) ;
res.mi = min(a.mi, b.mi) ;
return res ;
}
void build(ll id, ll l,ll r ) {
if(l == r ) {
val[id].mi = val[id].ma = NodeVal[tour[l]];
} else {
ll m = (l + r) >> 1 ;
build(id<<1, l, m ) ;
build(id<<1|1, m + 1, r ) ;
val[id ] =Merge(val[id<<1], val[id<<1|1]) ;
}
}
void fix(ll id, ll l, ll r ) {
if(lazy[id]) {
// ll tmp_ma = val[id].ma ;
// ll tmp_mi = val[id].mi ;
swap(val[id].ma, val[id].mi);
val[id].ma = -val[id].ma ;
val[id].mi = -val[id].mi;
if(l!=r ) {
lazy[id<<1] ^= lazy[id] ;
lazy[id<<1|1] ^=lazy[id] ;
}
lazy[id] = 0 ;
}
}
void update(ll id, ll l, ll r, ll u, ll v ) {
fix(id, l, r) ;
if(u > r || v < l ) return ;
if(u <= l && v >= r ) {
lazy[id] ^= 1 ;
fix(id, l, r ) ;
return ;
}
ll m = (l + r) >> 1 ;
update(id<< 1, l, m, u, v );
update(id<<1|1, m + 1, r, u, v ) ;
val[id] = Merge(val[id<<1], val[id<<1|1]) ;
}
ll get(ll id, ll l, ll r,ll u, ll v ) {
fix(id, l, r ) ;
if(u > r || v < l ) return INT_MIN ;
if(u <= l && v >= r ) {
return val[id].ma ;
}
ll m = (l + r) >> 1 ;
return max(get(id<<1, l, m, u, v ), get(id<< 1 |1, m + 1, r, u, v )) ;
}
void updatepos(ll id , ll l ,ll r , ll u , ll v , ll value) {
fix(id , l , r ) ;
if(u > r || v < l ) return ;
if(u <= l && v >= r ) {
val[id].ma = val[id].mi = value ;
return ;
}
ll m = l + r >> 1;
updatepos(id<<1 , l , m , u , v ,value) ;
updatepos(id<<1|1 , m + 1 , r ,u , v , value ) ;
val[id] =Merge(val[id<<1] , val[id<<1|1]) ;
}
} seg;
//**Function**//
void resetall() {
memset(tour, 0, sizeof tour) ;
memset(par, 0, sizeof par) ;
memset(st, 0, sizeof st) ;
memset(fin, 0, sizeof fin) ;
memset(high, 0, sizeof high) ;
memset(sz, 0, sizeof sz) ;
memset(chainHead, 0, sizeof chainHead) ;
memset(chainID, 0, sizeof chainID) ;
memset(NodeVal, 0, sizeof NodeVal ) ;
seg.resett();
edge.resize(0) ;
curchain = 1 ;
timedfs =0 ;
for(ll i = 0 ; i <= n ; i ++ ) adj[i].resize(0);
}
void dfs(ll u, ll p ) {
sz[u] = 1 ;
for(ll v : adj[u]) {
if(p != v ) {
high[v] = high[u] + 1 ;
par[v]= u ;
dfs(v, u) ;
sz[u] += sz[v];
}
}
}
void hld(ll u, ll p ) {
if(!chainHead[curchain]) {
chainHead[curchain ] = u ;
}
st[u] = ++ timedfs ;
tour[timedfs] = u;
chainID[u]= curchain ;
ll nxt = 0 ;
for(ll v : adj[u]) {
if(v == p ) continue ;
if(nxt == 0 || sz[v] > sz[nxt]) nxt = v;
}
if(nxt) hld(nxt, u) ;
for(ll v : adj[u]) {
if(v != p && v != nxt ) {
curchain ++ ;
hld(v, u ) ;
}
}
fin[u] = timedfs ;
}
ll LCA(ll u, ll v) {
while (chainID[u] != chainID[v]) {
if (high[chainHead[chainID[u]]] > high[chainHead[chainID[v]]])
u = par[chainHead[chainID[u]]];
else
v = par[chainHead[chainID[v]]];
}
return high[u] < high[v] ? u : v;
}
ll query(ll u, ll v ) {
if (u == v) {
return 0 ;
}
ll lca = LCA(u, v), ma = INT_MIN ;
while(chainID[u] != chainID[lca]) {
ma = max(ma, seg.get(1, 1, n,st[chainHead[chainID[u]]] , st[u] ));
u = par[chainHead[chainID[u]]];
}
while(chainID[v] != chainID[lca]) {
ma = max(ma, seg.get(1, 1, n, st[chainHead[chainID[v]]] , st[v] ));
v = par[chainHead[chainID[v]]] ;
}
if(u == v ) return ma ;
if(high[u] > high[v]) swap(u, v ) ;
return max(ma, seg.get(1, 1, n, st[u] + 1, st[v])) ;
}
void daodau(ll u, ll v ) {
ll lca = LCA(u, v) ;
while(chainID[u] != chainID[lca]) {
seg.update(1, 1, n, st[chainHead[chainID[u]]] , st[u] );
u = par[chainHead[chainID[u]]] ;
}
while(chainID[v] != chainID[lca]) {
seg.update(1, 1, n,st[chainHead[chainID[v]]] , st[v] );
v = par[chainHead[chainID[v]]] ;
}
if(u == v ) return ;
if(high[u] > high[v]) swap(u, v ) ;
seg.update(1, 1, n, st[u] + 1, st[v]) ;
}
void init() {
cin>>n ;
for(ll i = 1 ; i <= n - 1 ; i ++ ) {
ll x, y, w ;
cin>>x>>y>>w ;
edge.push_back({x, y, w }) ;
adj[x].push_back(y ) ;
adj[y].push_back(x) ;
}
dfs(1, 1 ) ;
for(ll i = 0 ; i < edge.size() ; i ++ ) {
ll u = edge[i].u;
ll v = edge[i].v ;
if(u == par[v]) swap(u, v ) ;// u : child
NodeVal[u] = edge[i].w;
}
hld(1, 1 ) ;
seg.build(1, 1, n );
}
void solve() {
// cout<<LCA(2 , 5) << " dưa" ;
//cout<<st[9] << " ew" << el ;
string str;
do {
cin>>str;
// cout<<str<<el ;
if (str == "DONE") return ;
// cout<<str<<el ;
if (str == "QUERY") {
ll x, y ;
cin >> x >> y;
cout << query(x, y) << el;
} else if (str == "NEGATE") {
ll x, y ;
cin >> x >> y;
daodau(x, y);
} else if(str == "CHANGE" ) {
ll x, y ;
cin >> x >> y;
ll u = edge[x - 1].u;
ll v = edge[x - 1].v;
edge[x-1 ].w = y ;
if (u == par[v]) swap(u, v); // u : child
seg.updatepos(1, 1, n, st[u] , st[u], y);
}
} while(str != "DONE") ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
ll t;
cin >> t;
for(ll i = 1 ; i <= t ; i ++ ) {
init();
solve();
resetall() ;
}
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZWwgIlxuIgojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgX19ST09UX18gaW50IG1haW4oKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAxMDAwMDEKI2RlZmluZSBHSU9JSEFOIDEwMDAwMDEKI2RlZmluZSBCTE9DS19TSVpFIDQyNQojZGVmaW5lIE1BWF9OT0RFIDEwMDEwMDEKI2RlZmluZSBMT0cgMTkKI2RlZmluZSBBTFBIQV9TSVpFIDI2CiNkZWZpbmUgQkFTRSAzMTEKI2RlZmluZSBOQU1FICJjaGVjayIKI2RlZmluZSBjb21wYXJlKHYpIHNvcnQoKHYpLmJlZ2luKCksICh2KS5lbmQoKSk7ICh2KS5lcmFzZSh1bmlxdWUoKHYpLmJlZ2luKCksICh2KS5lbmQoKSksICh2KS5lbmQoKSk7IC8vIGTDuW5nIMSR4buDIG7DqW4gc29ydCBt4bqjbmcgY29tcGFyZQp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBsbCBNT0RbXSA9IHsobGwpMWU5ICsgMjI3NywgKGxsKTFlOSArIDUyNzcsIChsbCkxZTkgKyA4Mjc3LCAobGwpMWU5ICsgOTI3NywgKGxsKSAxZTkgKyA3IH07CmNvbnN0IGxsIE5NT0QgPSAxOwpjb25zdCBpbnQgZHhbXSA9IHstMSwgMCwgMSwwfTsKY29uc3QgaW50IGR5W10gPSB7MCwgMSwgMCwgLTF9OwovLyoqVmFyaWFibGUqKi8vCmxsIG4gOwpsbCB0b3VyW01BWE5dIDsKbGwgcGFyW01BWE5dIDsKbGwgZmluW01BWE5dIDsKbGwgc3RbTUFYTl0gOwpsbCBoaWdoW01BWE5dIDsKbGwgc3pbTUFYTl0gOwpsbCBjaGFpbkhlYWRbTUFYTl0gOwpsbCBjaGFpbklEW01BWE5dIDsKbGwgTm9kZVZhbFtNQVhOXSA7CmxsIGN1cmNoYWluID0gMSAgOwpsbCB0aW1lZGZzID0wIDsKdmVjdG9yPGxsPmFkaltNQVhOXSA7Ci8vKipTdHJ1Y3QqKi8vCnN0cnVjdCBFIHsKICAgIGxsIHUsIHYsIHc7Cgp9Owp2ZWN0b3I8RT4gZWRnZSA7CnN0cnVjdCBTZWcgewogICAgc3RydWN0IERhdGEgewogICAgICAgIGxsIG1pLCBtYSAgOwogICAgfTsKICAgIERhdGEgdmFsW01BWE4gPDwgMiBdIDsKICAgIGxsIGxhenlbTUFYTjw8MiBdIDsKICAgIHZvaWQgcmVzZXR0KCkgewogICAgICAgIGZvcihsbCBpID0gMCAgOyBpIDwoTUFYTiA8PDIgICkgOyBpICsrICkgewogICAgICAgICAgICB2YWxbaV0ubWEgPSBJTlRfTUlOO3ZhbFtpXS4gbWkgPSBJTlRfTUFYIDsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KGxhenksIDAsIHNpemVvZiBsYXp5ICApIDsKICAgIH0KICAgIERhdGEgTWVyZ2UoRGF0YSBhLCBEYXRhIGIgKSB7CiAgICAgICAgRGF0YSByZXMgIDsKICAgICAgICByZXMubWEgPSBtYXgoYS5tYSwgYi5tYSApIDsKICAgICAgICByZXMubWkgPSBtaW4oYS5taSwgYi5taSkgIDsKICAgICAgICByZXR1cm4gcmVzIDsKICAgIH0KICAgIHZvaWQgYnVpbGQobGwgaWQsIGxsIGwsbGwgciApIHsKICAgICAgICBpZihsID09IHIgKSB7CiAgICAgICAgICAgIHZhbFtpZF0ubWkgPSB2YWxbaWRdLm1hID0gTm9kZVZhbFt0b3VyW2xdXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsbCBtID0gKGwgKyByKSA+PiAxIDsKICAgICAgICAgICAgYnVpbGQoaWQ8PDEsIGwsIG0gKSA7CiAgICAgICAgICAgIGJ1aWxkKGlkPDwxfDEsIG0gKyAxLCByICApIDsKICAgICAgICAgICAgdmFsW2lkIF0gPU1lcmdlKHZhbFtpZDw8MV0sIHZhbFtpZDw8MXwxXSkgOwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgZml4KGxsIGlkLCAgbGwgbCwgbGwgciApIHsKICAgICAgICBpZihsYXp5W2lkXSkgewovLyAgICAgICAgICAgIGxsIHRtcF9tYSA9IHZhbFtpZF0ubWEgOwovLyAgICAgICAgICAgIGxsIHRtcF9taSA9IHZhbFtpZF0ubWkgOwogICAgICAgICAgICBzd2FwKHZhbFtpZF0ubWEsIHZhbFtpZF0ubWkpOwogICAgICAgICAgICB2YWxbaWRdLm1hID0gLXZhbFtpZF0ubWEgOwogICAgICAgICAgICB2YWxbaWRdLm1pID0gLXZhbFtpZF0ubWk7CiAgICAgICAgICAgIGlmKGwhPXIgKSB7CiAgICAgICAgICAgICAgICBsYXp5W2lkPDwxXSBePSBsYXp5W2lkXSA7CiAgICAgICAgICAgICAgICBsYXp5W2lkPDwxfDFdIF49bGF6eVtpZF0gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhenlbaWRdICA9IDAgOwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgdXBkYXRlKGxsIGlkLCBsbCBsLCBsbCByLCBsbCB1LCBsbCB2ICkgewogICAgICAgIGZpeChpZCwgbCwgcikgOwogICAgICAgIGlmKHUgPiByICB8fCB2IDwgbCAgICkgcmV0dXJuICA7CiAgICAgICAgaWYodSA8PSBsICYmIHYgPj0gciApIHsKICAgICAgICAgICAgbGF6eVtpZF0gXj0gMSA7CiAgICAgICAgICAgIGZpeChpZCwgbCwgciApIDsKICAgICAgICAgICAgcmV0dXJuIDsKICAgICAgICB9CiAgICAgICAgbGwgbSA9IChsICsgcikgPj4gMSA7CiAgICAgICAgdXBkYXRlKGlkPDwgMSwgbCwgbSwgdSwgIHYgKTsKICAgICAgICB1cGRhdGUoaWQ8PDF8MSwgbSArIDEsIHIsIHUsIHYgICkgOwogICAgICAgIHZhbFtpZF0gPSBNZXJnZSh2YWxbaWQ8PDFdLCB2YWxbaWQ8PDF8MV0pIDsKICAgIH0KCiAgICBsbCBnZXQobGwgaWQsIGxsIGwsIGxsIHIsbGwgdSwgbGwgdiApIHsKICAgICAgICBmaXgoaWQsIGwsIHIgICkgIDsKICAgICAgICBpZih1ID4gciB8fCB2IDwgbCApIHJldHVybiBJTlRfTUlOICA7CiAgICAgICAgaWYodSA8PSBsICYmIHYgPj0gciApIHsKICAgICAgICAgICAgcmV0dXJuIHZhbFtpZF0ubWEgOwogICAgICAgIH0KICAgICAgICBsbCBtID0gKGwgKyByKSA+PiAxIDsKICAgICAgICByZXR1cm4gbWF4KGdldChpZDw8MSwgIGwsIG0sIHUsIHYgKSwgZ2V0KGlkPDwgMSB8MSwgbSArIDEsIHIsIHUsIHYgKSkgIDsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZXBvcyhsbCBpZCAsIGxsIGwgLGxsIHIgLCBsbCB1ICwgbGwgdiAgLCBsbCB2YWx1ZSkgewogICAgZml4KGlkICwgbCAsIHIgICkgOwogICAgaWYodSA+IHIgfHwgdiA8IGwgKSByZXR1cm4gOwogICAgaWYodSA8PSBsICYmIHYgPj0gciAgKSB7CiAgICAgICAgdmFsW2lkXS5tYSA9IHZhbFtpZF0ubWkgPSB2YWx1ZSAgOwogICAgICAgIHJldHVybiA7CiAgICB9CiAgICBsbCBtID0gbCAgKyByID4+IDE7CiAgICB1cGRhdGVwb3MoaWQ8PDEgLCBsICwgbSAgLCB1ICwgdiAsdmFsdWUpIDsKICAgIHVwZGF0ZXBvcyhpZDw8MXwxICwgbSArIDEgLCByICx1ICwgdiAsIHZhbHVlICkgOwogICAgdmFsW2lkXSA9TWVyZ2UodmFsW2lkPDwxXSAsIHZhbFtpZDw8MXwxXSkgOwogICAgfQp9IHNlZzsKLy8qKkZ1bmN0aW9uKiovLwp2b2lkIHJlc2V0YWxsKCkgewogICAgbWVtc2V0KHRvdXIsIDAsIHNpemVvZiB0b3VyKSA7CiAgICBtZW1zZXQocGFyLCAwLCBzaXplb2YgcGFyKSA7CiAgICBtZW1zZXQoc3QsIDAsIHNpemVvZiBzdCkgOwogICAgbWVtc2V0KGZpbiwgMCwgc2l6ZW9mIGZpbikgOwogICAgbWVtc2V0KGhpZ2gsIDAsIHNpemVvZiBoaWdoKSA7CiAgICBtZW1zZXQoc3osIDAsIHNpemVvZiBzeikgOwogICAgbWVtc2V0KGNoYWluSGVhZCwgMCwgc2l6ZW9mIGNoYWluSGVhZCkgOwogICAgbWVtc2V0KGNoYWluSUQsIDAsIHNpemVvZiBjaGFpbklEKSA7CiAgICBtZW1zZXQoTm9kZVZhbCwgMCwgc2l6ZW9mIE5vZGVWYWwgKSA7CiAgICBzZWcucmVzZXR0KCk7CiAgICBlZGdlLnJlc2l6ZSgwKSA7CiAgICBjdXJjaGFpbiA9IDEgIDsKICAgIHRpbWVkZnMgPTAgOwogICAgZm9yKGxsIGkgPSAwIDsgaSA8PSBuIDsgaSArKyApIGFkaltpXS5yZXNpemUoMCk7Cn0Kdm9pZCBkZnMobGwgdSwgbGwgcCApIHsKICAgIHN6W3VdID0gMSA7CiAgICBmb3IobGwgdiA6IGFkalt1XSkgewogICAgICAgIGlmKHAgIT0gdiApIHsKICAgICAgICAgICAgaGlnaFt2XSA9IGhpZ2hbdV0gKyAxIDsKICAgICAgICAgICAgcGFyW3ZdPSB1IDsKICAgICAgICAgICAgZGZzKHYsIHUpIDsKICAgICAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGhsZChsbCB1LCBsbCBwICkgewogICAgaWYoIWNoYWluSGVhZFtjdXJjaGFpbl0pIHsKICAgICAgICBjaGFpbkhlYWRbY3VyY2hhaW4gXSA9IHUgOwogICAgfQogICAgc3RbdV0gPSArKyB0aW1lZGZzIDsKICAgIHRvdXJbdGltZWRmc10gPSB1OwogICAgY2hhaW5JRFt1XT0gY3VyY2hhaW4gOwogICAgbGwgbnh0ID0gMCA7CiAgICBmb3IobGwgdiA6IGFkalt1XSkgewogICAgICAgIGlmKHYgPT0gcCApIGNvbnRpbnVlIDsKICAgICAgICBpZihueHQgPT0gMCB8fCBzelt2XSA+IHN6W254dF0pIG54dCA9IHY7CiAgICB9CiAgICBpZihueHQpIGhsZChueHQsIHUpIDsKICAgIGZvcihsbCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiAhPSBwICYmIHYgIT0gbnh0ICkgewogICAgICAgICAgICBjdXJjaGFpbiArKyA7CiAgICAgICAgICAgIGhsZCh2LCB1ICkgOwogICAgICAgIH0KICAgIH0KICAgIGZpblt1XSA9IHRpbWVkZnMgOwp9CmxsIExDQShsbCB1LCBsbCB2KSB7CiAgICB3aGlsZSAoY2hhaW5JRFt1XSAhPSBjaGFpbklEW3ZdKSB7CgogICAgICAgIGlmIChoaWdoW2NoYWluSGVhZFtjaGFpbklEW3VdXV0gPiBoaWdoW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0pCiAgICAgICAgICAgIHUgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdV1dXTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHYgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdl1dXTsKICAgIH0KICAgIHJldHVybiBoaWdoW3VdIDwgaGlnaFt2XSA/IHUgOiB2Owp9CgpsbCBxdWVyeShsbCB1LCBsbCB2ICkgewogICAgICBpZiAodSA9PSB2KSB7CiAgICAgICAgICAgICAgIHJldHVybiAwIDsKICAgICAgICAgICAgfQogICAgbGwgbGNhID0gTENBKHUsIHYpLCBtYSA9IElOVF9NSU4gOwogICAgd2hpbGUoY2hhaW5JRFt1XSAhPSBjaGFpbklEW2xjYV0pIHsKICAgICAgICBtYSA9IG1heChtYSwgc2VnLmdldCgxLCAxLCBuLHN0W2NoYWluSGVhZFtjaGFpbklEW3VdXV0gICAsIHN0W3VdICkpOwogICAgICAgIHUgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdV1dXTsKICAgIH0KICAgIHdoaWxlKGNoYWluSURbdl0gIT0gY2hhaW5JRFtsY2FdKSB7CiAgICAgICAgbWEgPSBtYXgobWEsIHNlZy5nZXQoMSwgMSwgbiwgc3RbY2hhaW5IZWFkW2NoYWluSURbdl1dXSAgLCBzdFt2XSApKTsKICAgICAgICB2ID0gcGFyW2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gOwogICAgfQogICAgaWYodSA9PSB2ICkgcmV0dXJuIG1hIDsKICAgIGlmKGhpZ2hbdV0gPiBoaWdoW3ZdKSBzd2FwKHUsIHYgKSA7CiAgICByZXR1cm4gbWF4KG1hLCBzZWcuZ2V0KDEsIDEsIG4sIHN0W3VdICsgMSwgc3Rbdl0pKSA7Cn0Kdm9pZCBkYW9kYXUobGwgdSwgbGwgdiApIHsKICAgIGxsIGxjYSA9IExDQSh1LCB2KSA7CiAgICB3aGlsZShjaGFpbklEW3VdICE9IGNoYWluSURbbGNhXSkgewogICAgICAgIHNlZy51cGRhdGUoMSwgMSwgbiwgc3RbY2hhaW5IZWFkW2NoYWluSURbdV1dXSAgICAsIHN0W3VdICk7CiAgICAgICAgdSA9IHBhcltjaGFpbkhlYWRbY2hhaW5JRFt1XV1dIDsKICAgIH0KICAgIHdoaWxlKGNoYWluSURbdl0gIT0gY2hhaW5JRFtsY2FdKSB7CiAgICAgICAgc2VnLnVwZGF0ZSgxLCAxLCBuLHN0W2NoYWluSGVhZFtjaGFpbklEW3ZdXV0gLCBzdFt2XSApOwogICAgICAgIHYgPSBwYXJbY2hhaW5IZWFkW2NoYWluSURbdl1dXSA7CiAgICB9CiAgICBpZih1ID09IHYgKSByZXR1cm4gOwogICAgaWYoaGlnaFt1XSA+IGhpZ2hbdl0pIHN3YXAodSwgdiApIDsKICAgIHNlZy51cGRhdGUoMSwgMSwgbiwgc3RbdV0gKyAxLCBzdFt2XSkgOwp9CnZvaWQgaW5pdCgpIHsKICAgIGNpbj4+biA7CiAgICBmb3IobGwgaSA9IDEgOyBpIDw9IG4gLSAxIDsgaSArKyApIHsKICAgICAgICBsbCB4LCB5LCB3IDsKICAgICAgICBjaW4+Png+Pnk+PncgOwogICAgICAgIGVkZ2UucHVzaF9iYWNrKHt4LCB5LCB3IH0pIDsKICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHkgKSA7CiAgICAgICAgYWRqW3ldLnB1c2hfYmFjayh4KSAgOwogICAgfQogICAgZGZzKDEsIDEgICApIDsKICAgIGZvcihsbCBpID0gMCA7IGkgPCBlZGdlLnNpemUoKSA7IGkgKysgKSAgewogICAgICAgIGxsIHUgPSBlZGdlW2ldLnU7CiAgICAgICAgbGwgdiA9IGVkZ2VbaV0udiA7CiAgICAgICAgaWYodSA9PSBwYXJbdl0pIHN3YXAodSwgdiApIDsvLyB1IDogY2hpbGQKICAgICAgICBOb2RlVmFsW3VdID0gZWRnZVtpXS53OwogICAgfQogICAgaGxkKDEsIDEgKSA7CiAgICBzZWcuYnVpbGQoMSwgMSwgbiApOwp9Cgp2b2lkIHNvbHZlKCkgewovLyAgICBjb3V0PDxMQ0EoMiAsIDUpIDw8ICIgZMawYSIgOwovL2NvdXQ8PHN0WzldIDw8ICIgZXciIDw8IGVsIDsKICAgIHN0cmluZyBzdHI7CiAgICBkbyB7CiAgICAgICAgY2luPj5zdHI7Ci8vICAgICAgICAgIGNvdXQ8PHN0cjw8ZWwgOwogICAgICAgIGlmIChzdHIgPT0gIkRPTkUiKSByZXR1cm4gOwovLyAgICAgICAgICAgIGNvdXQ8PHN0cjw8ZWwgOwogICAgICAgIGlmIChzdHIgPT0gIlFVRVJZIikgewogICAgICAgICAgICBsbCB4LCB5IDsKICAgICAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICAgICAgY291dCA8PCBxdWVyeSh4LCB5KSA8PCBlbDsKICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAiTkVHQVRFIikgewogICAgICAgICAgICBsbCB4LCB5IDsKICAgICAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICAgICAgZGFvZGF1KHgsIHkpOwogICAgICAgIH0gZWxzZSBpZihzdHIgPT0gIkNIQU5HRSIgKSB7CiAgICAgICAgICAgIGxsIHgsIHkgOwogICAgICAgICAgICBjaW4gPj4geCA+PiB5OwogICAgICAgICAgICBsbCB1ID0gZWRnZVt4IC0gMV0udTsKICAgICAgICAgICAgbGwgdiA9IGVkZ2VbeCAtIDFdLnY7CiAgICAgICAgICAgIGVkZ2VbeC0xIF0udyA9IHkgOwogICAgICAgICAgICBpZiAodSA9PSBwYXJbdl0pIHN3YXAodSwgdik7IC8vIHUgOiBjaGlsZAogICAgICAgICAgICBzZWcudXBkYXRlcG9zKDEsIDEsIG4sIHN0W3VdICwgc3RbdV0sIHkpOwogICAgICAgIH0KICAgIH0gd2hpbGUoc3RyICE9ICJET05FIikgOwp9CgoKX19ST09UX18gewovLyAgICBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7Ci8vICAgICAgICAgICAgICBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgZmFzdDsKICAgIGxsIHQ7CiAgICBjaW4gPj4gdDsKICAgIGZvcihsbCBpID0gMSA7IGkgPD0gdCA7IGkgKysgKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHNvbHZlKCk7CiAgICAgICAgcmVzZXRhbGwoKSA7CiAgICB9Cn0KCg==