#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
struct graph{
int N;
int * es;
int ** edge;
void setEdgeRootedTree( int N__, int M, int A[ ] , int B[ ] , int root= 0 , int reorder= 0 , int cnv[ ] = NULL , void ** mem = & wmem) {
int i;
int j;
int k;
int * dist;
int * q;
int qs;
int qe;
int * ind;
void * tmem;
N = N__;
tmem = ( ( char * ) ( * mem) ) + ( sizeof ( int ) * N + 15 ) + ( sizeof ( int * ) * N + 15 ) + ( sizeof ( int ) * M + 15 * N) ;
walloc1d( & es, N, mem) ;
walloc1d( & edge, N, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
es[ A[ i] ] ++ ;
es[ B[ i] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , & tmem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
edge[ A[ i] ] [ es[ A[ i] ] ++ ] = B[ i] ;
edge[ B[ i] ] [ es[ B[ i] ] ++ ] = A[ i] ;
}
walloc1d( & dist, N, & tmem) ;
walloc1d( & q, N, & tmem) ;
walloc1d( & ind, N, & tmem) ;
if ( cnv== NULL ) {
walloc1d( & cnv, N, & tmem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
dist[ i] = - 1 ;
}
dist[ root] = 0 ;
qs = qe = 0 ;
q[ qe++ ] = root;
while ( qs < qe) {
i = q[ qs++ ] ;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k = edge[ i] [ j] ;
if ( dist[ k] == - 1 ) {
dist[ k] = dist[ i] + 1 ;
q[ qe++ ] = k;
}
}
}
if ( reorder == 0 ) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnv[ i] = i;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
ind[ i] = i;
}
}
else {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
cnv[ i] = q[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
ind[ cnv[ i] ] = i;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
j = A[ i] ;
k = B[ i] ;
if ( dist[ j] > dist[ k] ) {
swap( j, k) ;
}
es[ ind[ j] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , mem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
j = A[ i] ;
k = B[ i] ;
if ( dist[ j] > dist[ k] ) {
swap( j, k) ;
}
j = ind[ j] ;
k = ind[ k] ;
edge[ j] [ es[ j] ++ ] = k;
}
}
int preorder( int res[ ] , int root = 0 , void * mem= wmem) {
int i;
int j;
int k;
int sts;
int sz = 0 ;
long long * st;
char * vis;
walloc1d( & vis, N, & mem) ;
walloc1d( & st, N, & mem) ;
sts = 0 ;
st[ sts++ ] = ( ( long long ) root) << 32 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
vis[ i] = 0 ;
}
vis[ root] = 1 ;
while ( sts) {
i = st[ -- sts] >> 32 ;
j = st[ sts] & 2147483647 ;
if ( j== 0 ) {
res[ sz++ ] = i;
}
while ( j < es[ i] ) {
k = edge[ i] [ j++ ] ;
if ( vis[ k] ) {
continue ;
}
if ( j < es[ i] ) {
st[ sts++ ] = ( ( ( long long ) i) << 32 ) + j;
}
vis[ k] = 1 ;
st[ sts++ ] = ( ( long long ) k) << 32 ;
break ;
}
}
return sz;
}
}
;
template < class T, class S> inline int vec2arr( vector< T> & v, S arr[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = v[ i] ;
}
return N;
}
template < class T, class S1, class S2> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
}
return N;
}
template < class T, class S1, class S2, class S3> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] , S3 arr3[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
arr3[ i] = v[ i] [ 2 ] ;
}
return N;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
long long maximumScoreAfterOperations( vector< vector< int >> & edges, vector< int > & A) {
int Nzj9Y0kE;
dummy_main( ) ;
static int N;
static int a[ 100000 ] ;
static int b[ 100000 ] ;
static int pre[ 100000 ] ;
static long long dp[ 100000 ] [ 2 ] ;
graph g;
N = vec2arr( edges, a, b) + 1 ;
g.setEdgeRootedTree ( N, N- 1 , a, b) ;
g.preorder ( pre) ;
for ( Nzj9Y0kE= ( N) - 1 ; Nzj9Y0kE>= ( 0 ) ; Nzj9Y0kE-- ) {
int QAAnbtfa;
auto & i = pre[ Nzj9Y0kE] ;
long long s0 = 0 ;
long long s1 = 0 ;
for ( QAAnbtfa= ( 0 ) ; QAAnbtfa< ( g.es [ i] ) ; QAAnbtfa++ ) {
auto & j = g.edge [ i] [ QAAnbtfa] ;
auto R5MtCiij = ( ( dp[ j] [ 0 ] ) ) ;
auto YGwFZBGH = ( ( dp[ j] [ 1 ] ) ) ;
s0+ = R5MtCiij;
s1+ = YGwFZBGH;
}
auto OA9NF42T = ( s1 + ( 0 ) ) ;
auto ATMZloZo = ( s1 + ( A[ i] ) ) ;
dp[ i] [ 0 ] = OA9NF42T;
dp[ i] [ 1 ] = ATMZloZo;
if ( g.es [ i] ) {
chmax( dp[ i] [ 0 ] , A[ i] + s0) ;
}
}
return dp[ 0 ] [ 0 ] ;
}
}
;
// cLay version 20231031-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// ll maximumScoreAfterOperations(VVI &edges, VI &A) {
// dummy_main();
// static int N, a[1d5], b[], pre[];
// static ll dp[1d5][2];
// graph g;
// N = vec2arr(edges, a, b) + 1;
// g.setEdgeRootedTree(N, N-1, a, b);
// g.preorder(pre);
// rrep[pre](i,N){
// ll s0 = 0, s1 = 0;
// rep[g.edge[i]](j,g.es[i]) (s0, s1) += (dp[j][0], dp[j][1]);
// (dp[i][0], dp[i][1]) = s1 + (0, A[i]);
// if(g.es[i]) dp[i][0] >?= A[i] + s0;
// }
// return dp[0][0];
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htYXgoUyAmYSwgVCBiKXsKICBpZihhPGIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBzdGF0aWMgaW50IHNraXBbMTZdID0gezAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDF9OwogICgqbWVtKSA9ICh2b2lkKikoICgoY2hhciopKCptZW0pKSArIHNraXBbKCh1bnNpZ25lZCBsb25nIGxvbmcpKCptZW0pKSAmIDE1XSApOwogICgqYXJyKT0oVCopKCptZW0pOwogICgqbWVtKT0oKCphcnIpK3gpOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4MSwgaW50IHgyLCB2b2lkICoqbWVtID0gJndtZW0pewogIHdhbGxvYzFkKGFyciwgeDIteDEsIG1lbSk7CiAgKCphcnIpIC09IHgxOwp9CnN0cnVjdCBncmFwaHsKICBpbnQgTjsKICBpbnQqZXM7CiAgaW50KiplZGdlOwogIHZvaWQgc2V0RWRnZVJvb3RlZFRyZWUoaW50IE5fXywgaW50IE0sIGludCBBW10sIGludCBCW10sIGludCByb290PTAsIGludCByZW9yZGVyPTAsIGludCBjbnZbXSA9IE5VTEwsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBpbnQqZGlzdDsKICAgIGludCpxOwogICAgaW50IHFzOwogICAgaW50IHFlOwogICAgaW50KmluZDsKICAgIHZvaWQqdG1lbTsKICAgIE4gPSBOX187CiAgICB0bWVtID0gKChjaGFyKikoKm1lbSkpICsgKHNpemVvZihpbnQpICogTiArIDE1KSArIChzaXplb2YoaW50KikgKiBOICsgMTUpICsgKHNpemVvZihpbnQpICogTSArIDE1ICogTik7CiAgICB3YWxsb2MxZCgmZXMsIE4sIG1lbSk7CiAgICB3YWxsb2MxZCgmZWRnZSwgTiwgbWVtKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgZXNbQVtpXV0rKzsKICAgICAgZXNbQltpXV0rKzsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICB3YWxsb2MxZCgmZWRnZVtpXSwgZXNbaV0sICZ0bWVtKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgZWRnZVtBW2ldXVtlc1tBW2ldXSsrXSA9IEJbaV07CiAgICAgIGVkZ2VbQltpXV1bZXNbQltpXV0rK10gPSBBW2ldOwogICAgfQogICAgd2FsbG9jMWQoJmRpc3QsIE4sICZ0bWVtKTsKICAgIHdhbGxvYzFkKCZxLCBOLCAmdG1lbSk7CiAgICB3YWxsb2MxZCgmaW5kLCBOLCAmdG1lbSk7CiAgICBpZihjbnY9PU5VTEwpewogICAgICB3YWxsb2MxZCgmY252LCBOLCAmdG1lbSk7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZGlzdFtpXSA9IC0xOwogICAgfQogICAgZGlzdFtyb290XSA9IDA7CiAgICBxcyA9IHFlID0gMDsKICAgIHFbcWUrK10gPSByb290OwogICAgd2hpbGUocXMgPCBxZSl7CiAgICAgIGkgPSBxW3FzKytdOwogICAgICBmb3Ioaj0oMCk7ajwoZXNbaV0pO2orKyl7CiAgICAgICAgayA9IGVkZ2VbaV1bal07CiAgICAgICAgaWYoZGlzdFtrXT09LTEpewogICAgICAgICAgZGlzdFtrXSA9IGRpc3RbaV0gKyAxOwogICAgICAgICAgcVtxZSsrXSA9IGs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZihyZW9yZGVyID09IDApewogICAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgICBjbnZbaV0gPSBpOwogICAgICB9CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIGluZFtpXSA9IGk7CiAgICAgIH0KICAgIH0KICAgIGVsc2V7CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIGNudltpXSA9IHFbaV07CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgaW5kW2NudltpXV0gPSBpOwogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZXNbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE0pO2krKyl7CiAgICAgIGogPSBBW2ldOwogICAgICBrID0gQltpXTsKICAgICAgaWYoZGlzdFtqXSA+IGRpc3Rba10pewogICAgICAgIHN3YXAoaiwgayk7CiAgICAgIH0KICAgICAgZXNbaW5kW2pdXSsrOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHdhbGxvYzFkKCZlZGdlW2ldLCBlc1tpXSwgbWVtKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgaiA9IEFbaV07CiAgICAgIGsgPSBCW2ldOwogICAgICBpZihkaXN0W2pdID4gZGlzdFtrXSl7CiAgICAgICAgc3dhcChqLCBrKTsKICAgICAgfQogICAgICBqID0gaW5kW2pdOwogICAgICBrID0gaW5kW2tdOwogICAgICBlZGdlW2pdW2VzW2pdKytdID0gazsKICAgIH0KICB9CiAgaW50IHByZW9yZGVyKGludCByZXNbXSwgaW50IHJvb3QgPSAwLCB2b2lkICptZW09d21lbSl7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBpbnQgc3RzOwogICAgaW50IHN6ID0gMDsKICAgIGxvbmcgbG9uZypzdDsKICAgIGNoYXIqdmlzOwogICAgd2FsbG9jMWQoJnZpcywgTiwgJm1lbSk7CiAgICB3YWxsb2MxZCgmc3QsIE4sICZtZW0pOwogICAgc3RzID0gMDsKICAgIHN0W3N0cysrXSA9ICgobG9uZyBsb25nKXJvb3QpIDw8IDMyOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHZpc1tpXSA9IDA7CiAgICB9CiAgICB2aXNbcm9vdF0gPSAxOwogICAgd2hpbGUoc3RzKXsKICAgICAgaSA9IHN0Wy0tc3RzXSA+PiAzMjsKICAgICAgaiA9IHN0W3N0c10gJiAyMTQ3NDgzNjQ3OwogICAgICBpZihqPT0wKXsKICAgICAgICByZXNbc3orK10gPSBpOwogICAgICB9CiAgICAgIHdoaWxlKGogPCBlc1tpXSl7CiAgICAgICAgayA9IGVkZ2VbaV1baisrXTsKICAgICAgICBpZih2aXNba10pewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmKGogPCBlc1tpXSl7CiAgICAgICAgICBzdFtzdHMrK10gPSAoKChsb25nIGxvbmcpaSkgPDwgMzIpICsgajsKICAgICAgICB9CiAgICAgICAgdmlzW2tdID0gMTsKICAgICAgICBzdFtzdHMrK10gPSAoKGxvbmcgbG9uZylrKSA8PCAzMjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN6OwogIH0KfQo7CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8VD4gJnYsIFMgYXJyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnJbaV0gPSB2W2ldOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzI+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8dmVjdG9yPFQ+PiAmdiwgUzEgYXJyMVtdLCBTMiBhcnIyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzIsIGNsYXNzIFMzPiBpbmxpbmUgaW50IHZlYzJhcnIodmVjdG9yPHZlY3RvcjxUPj4gJnYsIFMxIGFycjFbXSwgUzIgYXJyMltdLCBTMyBhcnIzW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogICAgYXJyM1tpXSA9IHZbaV1bMl07CiAgfQogIHJldHVybiBOOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgbG9uZyBsb25nIG1heGltdW1TY29yZUFmdGVyT3BlcmF0aW9ucyh2ZWN0b3I8dmVjdG9yPGludD4+ICZlZGdlcywgdmVjdG9yPGludD4gJkEpewogICAgaW50IE56ajlZMGtFOwogICAgZHVtbXlfbWFpbigpOwogICAgc3RhdGljIGludCBOOwogICAgc3RhdGljIGludCBhWzEwMDAwMF07CiAgICBzdGF0aWMgaW50IGJbMTAwMDAwXTsKICAgIHN0YXRpYyBpbnQgcHJlWzEwMDAwMF07CiAgICBzdGF0aWMgbG9uZyBsb25nIGRwWzEwMDAwMF1bMl07CiAgICBncmFwaCBnOwogICAgTiA9IHZlYzJhcnIoZWRnZXMsIGEsIGIpICsgMTsKICAgIGcuc2V0RWRnZVJvb3RlZFRyZWUoTiwgTi0xLCBhLCBiKTsKICAgIGcucHJlb3JkZXIocHJlKTsKICAgIGZvcihOemo5WTBrRT0oTiktMTtOemo5WTBrRT49KDApO056ajlZMGtFLS0pewogICAgICBpbnQgUUFBbmJ0ZmE7CiAgICAgIGF1dG8maSA9IHByZVtOemo5WTBrRV07CiAgICAgIGxvbmcgbG9uZyBzMCA9IDA7CiAgICAgIGxvbmcgbG9uZyBzMSA9IDA7CiAgICAgIGZvcihRQUFuYnRmYT0oMCk7UUFBbmJ0ZmE8KGcuZXNbaV0pO1FBQW5idGZhKyspewogICAgICAgIGF1dG8maiA9IGcuZWRnZVtpXVtRQUFuYnRmYV07CiAgICAgICAgYXV0byBSNU10Q2lpaiA9ICgoZHBbal1bMF0pKTsKICAgICAgICBhdXRvIFlHd0ZaQkdIID0gKCggZHBbal1bMV0pKTsKICAgICAgICBzMCs9UjVNdENpaWo7CiAgICAgICAgczErPVlHd0ZaQkdIOwogICAgICB9CiAgICAgIGF1dG8gT0E5TkY0MlQgPSAoczEgKyAoMCkpOwogICAgICBhdXRvIEFUTVpsb1pvID0gKHMxICsgKCBBW2ldKSk7CiAgICAgIGRwW2ldWzBdPU9BOU5GNDJUOwogICAgICBkcFtpXVsxXT1BVE1abG9abzsKICAgICAgaWYoZy5lc1tpXSl7CiAgICAgICAgY2htYXgoZHBbaV1bMF0sIEFbaV0gKyBzMCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkcFswXVswXTsKICB9Cn0KOwovLyBjTGF5IHZlcnNpb24gMjAyMzEwMzEtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBsbCBtYXhpbXVtU2NvcmVBZnRlck9wZXJhdGlvbnMoVlZJICZlZGdlcywgVkkgJkEpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIHN0YXRpYyBpbnQgTiwgYVsxZDVdLCBiW10sIHByZVtdOwovLyAgICAgc3RhdGljIGxsIGRwWzFkNV1bMl07Ci8vICAgICBncmFwaCBnOwovLyAgICAgTiA9IHZlYzJhcnIoZWRnZXMsIGEsIGIpICsgMTsKLy8gICAgIGcuc2V0RWRnZVJvb3RlZFRyZWUoTiwgTi0xLCBhLCBiKTsKLy8gICAgIGcucHJlb3JkZXIocHJlKTsKLy8gICAgIHJyZXBbcHJlXShpLE4pewovLyAgICAgICBsbCBzMCA9IDAsIHMxID0gMDsKLy8gICAgICAgcmVwW2cuZWRnZVtpXV0oaixnLmVzW2ldKSAoczAsIHMxKSArPSAoZHBbal1bMF0sIGRwW2pdWzFdKTsKLy8gICAgICAgKGRwW2ldWzBdLCBkcFtpXVsxXSkgPSBzMSArICgwLCBBW2ldKTsKLy8gICAgICAgaWYoZy5lc1tpXSkgZHBbaV1bMF0gPj89IEFbaV0gKyBzMDsKLy8gICAgIH0KLy8gICAgIHJldHVybiBkcFswXVswXTsKLy8gICB9Ci8vIH07Cg==