import java.io.* ;
import java.util.* ;
/**
* Created by Shreyans on 4/21/2015 at 1:37 AM using IntelliJ IDEA (Fast IO Template)
*/
//ADD PUBLIC FOR CF,TC
class EZDIJKST
{
{
InputReader in
= new InputReader
( System .
in ) ; OutputWriter out
= new OutputWriter
( System .
out ) ; int t= in.readInt ( ) ;
for ( int i1= 0 ; i1< t; i1++ )
{
List
< ArrayList
< AbstractMap .
SimpleEntry < Integer ,Integer
>>> gr
= new ArrayList
< ArrayList
< AbstractMap .
SimpleEntry < Integer , Integer
>>> ( ) ; //AbstractMap.SimpleEntry<Integer,Integer> is similar to pair<int a,int b> in C++ int v= in.readInt ( ) ;
int e= in.readInt ( ) ;
Set< Integer> vertices= new HashSet< Integer> ( ) ;
for ( int i= 0 ; i<= v; i++ )
{
vertices.add ( i) ;
}
vertices.remove ( 0 ) ; //Not intended hence removed
for ( int i= 0 ; i< e; i++ )
{
int a = in.readInt ( ) ;
int b = in.readInt ( ) ;
int c = in.readInt ( ) ;
}
int s= in.readInt ( ) ;
int des= in.readInt ( ) ;
int [ ] d= new int [ v+ 1 ] ;
d[ s] = 0 ;
vertices.remove ( s) ;
{
ts.add ( pair) ;
d[ pair.getKey ( ) ] = pair.getValue ( ) ;
}
while ( ! vertices.isEmpty ( ) &&! ts.isEmpty ( ) )
{
int V= curr.getKey ( ) ;
int W= curr.getValue ( ) ;
{
int v1= pair.getKey ( ) ;
int w1= pair.getValue ( ) ;
if ( d[ v1] > W+ w1)
{
d[ v1] = W+ w1;
}
ts.add ( pair) ;
}
vertices.remove ( V) ;
}
{
out.printLine ( "NO" ) ;
}
else
{
out.printLine ( d[ des] ) ;
}
}
{
out.close ( ) ;
}
}
static public class WeightComparator implements
{
@Override
{
return Integer .
compare ( one.
getValue ( ) , two.
getValue ( ) ) ; }
}
//FAST IO
private static class InputReader
{
private byte [ ] buf = new byte [ 1024 ] ;
private int curChar;
private int numChars;
private SpaceCharFilter filter;
{
this .stream = stream;
}
public int read( )
{
if ( numChars == - 1 )
throw new InputMismatchException( ) ;
if ( curChar >= numChars)
{
curChar = 0 ;
try
{
numChars = stream.read ( buf) ;
{
throw new InputMismatchException( ) ;
}
if ( numChars <= 0 )
return - 1 ;
}
return buf[ curChar++ ] ;
}
public int readInt( )
{
int c = read( ) ;
while ( isSpaceChar( c) )
c = read( ) ;
int sgn = 1 ;
if ( c == '-' )
{
sgn = - 1 ;
c = read( ) ;
}
int res = 0 ;
do
{
if ( c < '0' || c > '9' )
throw new InputMismatchException( ) ;
res *= 10 ;
res += c - '0' ;
c = read( ) ;
} while ( ! isSpaceChar( c) ) ;
return res * sgn;
}
{
int c = read( ) ;
while ( isSpaceChar( c) )
c = read( ) ;
StringBuilder res = new StringBuilder( ) ;
do
{
res.appendCodePoint ( c) ;
c = read( ) ;
} while ( ! isSpaceChar( c) ) ;
return res.toString ( ) ;
}
public double readDouble( )
{
int c = read( ) ;
while ( isSpaceChar( c) )
c = read( ) ;
int sgn = 1 ;
if ( c == '-' )
{
sgn = - 1 ;
c = read( ) ;
}
double res = 0 ;
while ( ! isSpaceChar( c) && c != '.' )
{
if ( c == 'e' || c == 'E' )
return res
* Math .
pow ( 10 , readInt
( ) ) ; if ( c < '0' || c > '9' )
throw new InputMismatchException( ) ;
res *= 10 ;
res += c - '0' ;
c = read( ) ;
}
if ( c == '.' )
{
c = read( ) ;
double m = 1 ;
while ( ! isSpaceChar( c) )
{
if ( c == 'e' || c == 'E' )
return res
* Math .
pow ( 10 , readInt
( ) ) ; if ( c < '0' || c > '9' )
throw new InputMismatchException( ) ;
m /= 10 ;
res += ( c - '0' ) * m;
c = read( ) ;
}
}
return res * sgn;
}
public long readLong( )
{
int c = read( ) ;
while ( isSpaceChar( c) )
c = read( ) ;
int sgn = 1 ;
if ( c == '-' )
{
sgn = - 1 ;
c = read( ) ;
}
long res = 0 ;
do
{
if ( c < '0' || c > '9' )
throw new InputMismatchException( ) ;
res *= 10 ;
res += c - '0' ;
c = read( ) ;
} while ( ! isSpaceChar( c) ) ;
return res * sgn;
}
public boolean isSpaceChar( int c)
{
if ( filter != null )
return filter.isSpaceChar ( c) ;
return c == ' ' || c == '\n ' || c == '\r ' || c == '\t ' || c == - 1 ;
}
{
return readString( ) ;
}
public interface SpaceCharFilter
{
public boolean isSpaceChar( int ch) ;
}
}
private static class OutputWriter
{
{
}
public OutputWriter
( Writer writer
) {
}
public void print
( Object ...
objects ) {
for ( int i = 0 ; i < objects.length ; i++ )
{
if ( i != 0 )
writer.print ( ' ' ) ;
writer.print ( objects[ i] ) ;
}
}
public void printLine
( Object ...
objects ) {
print( objects) ;
writer.println ( ) ;
}
public void close( )
{
writer.close ( ) ;
}
public void flush( )
{
writer.flush ( ) ;
}
}
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIENyZWF0ZWQgYnkgU2hyZXlhbnMgb24gNC8yMS8yMDE1IGF0IDE6MzcgQU0gdXNpbmcgSW50ZWxsaUogSURFQSAoRmFzdCBJTyBUZW1wbGF0ZSkKICovCgovL0FERCBQVUJMSUMgRk9SIENGLFRDCmNsYXNzIEVaRElKS1NUCnsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KICAgIHsKICAgICAgICBJbnB1dFJlYWRlciBpbiA9IG5ldyBJbnB1dFJlYWRlcihTeXN0ZW0uaW4pOwogICAgICAgIE91dHB1dFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0V3JpdGVyKFN5c3RlbS5vdXQpOwogICAgICAgIGludCB0PWluLnJlYWRJbnQoKTsKICAgICAgICBmb3IoaW50IGkxPTA7aTE8dDtpMSsrKQogICAgICAgIHsKICAgICAgICAgICAgTGlzdDxBcnJheUxpc3Q8QWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlcixJbnRlZ2VyPj4+IGdyPW5ldyBBcnJheUxpc3Q8QXJyYXlMaXN0PEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+Pj4oKTsvL0Fic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsSW50ZWdlcj4gaXMgc2ltaWxhciB0byBwYWlyPGludCBhLGludCBiPiBpbiBDKysKICAgICAgICAgICAgaW50IHY9aW4ucmVhZEludCgpOwogICAgICAgICAgICBpbnQgZT1pbi5yZWFkSW50KCk7CiAgICAgICAgICAgIFNldDxJbnRlZ2VyPiB2ZXJ0aWNlcz1uZXcgSGFzaFNldDxJbnRlZ2VyPigpOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPD12O2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmVydGljZXMuYWRkKGkpOwogICAgICAgICAgICAgICAgZ3IuYWRkKG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZlcnRpY2VzLnJlbW92ZSgwKTsvL05vdCBpbnRlbmRlZCBoZW5jZSByZW1vdmVkCiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8ZTtpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBhID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgICAgaW50IGIgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgICAgIGdyLmdldChhKS5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+KGIsIGMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgcz1pbi5yZWFkSW50KCk7CiAgICAgICAgICAgIGludCBkZXM9aW4ucmVhZEludCgpOwogICAgICAgICAgICBDb21wYXJhdG9yPEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+PiBjb21wYXJhdG9yPW5ldyBXZWlnaHRDb21wYXJhdG9yKCk7CiAgICAgICAgICAgIFRyZWVTZXQ8QWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+dHM9bmV3IFRyZWVTZXQ8QWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+KGNvbXBhcmF0b3IpOwogICAgICAgICAgICBpbnRbXWQ9bmV3IGludFt2KzFdOwogICAgICAgICAgICBBcnJheXMuZmlsbChkLEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgICAgZFtzXT0wOwogICAgICAgICAgICB2ZXJ0aWNlcy5yZW1vdmUocyk7CiAgICAgICAgICAgIGZvcihBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBwYWlyOmdyLmdldChzKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHMuYWRkKHBhaXIpOwogICAgICAgICAgICAgICAgZFtwYWlyLmdldEtleSgpXT1wYWlyLmdldFZhbHVlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUoIXZlcnRpY2VzLmlzRW1wdHkoKSYmIXRzLmlzRW1wdHkoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gY3Vycj10cy5wb2xsRmlyc3QoKTsKICAgICAgICAgICAgICAgIGludCBWPWN1cnIuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICBpbnQgVz1jdXJyLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBmb3IoQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gcGFpcjpnci5nZXQoVikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IHYxPXBhaXIuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgICAgaW50IHcxPXBhaXIuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICBpZihkW3YxXT5XK3cxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZFt2MV09Vyt3MTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHMuYWRkKHBhaXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmVydGljZXMucmVtb3ZlKFYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKGRbZGVzXT09SW50ZWdlci5NQVhfVkFMVUUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG91dC5wcmludExpbmUoIk5PIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvdXQucHJpbnRMaW5lKGRbZGVzXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IHBhaXI9bmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsSW50ZWdlcj4oMSwxKTsKICAgICAgICB7CiAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgV2VpZ2h0Q29tcGFyYXRvciBpbXBsZW1lbnRzCiAgICAgICAgICAgIENvbXBhcmF0b3I8QWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+CiAgICB7CiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIGludCBjb21wYXJlKEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+IG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gdHdvKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZShvbmUuZ2V0VmFsdWUoKSwgdHdvLmdldFZhbHVlKCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvL0ZBU1QgSU8KICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElucHV0UmVhZGVyCiAgICB7CiAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07CiAgICAgICAgcHJpdmF0ZSBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CiAgICAgICAgcHJpdmF0ZSBpbnQgY3VyQ2hhcjsKICAgICAgICBwcml2YXRlIGludCBudW1DaGFyczsKICAgICAgICBwcml2YXRlIFNwYWNlQ2hhckZpbHRlciBmaWx0ZXI7CgogICAgICAgIHB1YmxpYyBJbnB1dFJlYWRlcihJbnB1dFN0cmVhbSBzdHJlYW0pCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpCiAgICAgICAgewogICAgICAgICAgICBpZiAobnVtQ2hhcnMgPT0gLTEpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpOwogICAgICAgICAgICBpZiAoY3VyQ2hhciA+PSBudW1DaGFycykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3VyQ2hhciA9IDA7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBudW1DaGFycyA9IHN0cmVhbS5yZWFkKGJ1Zik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnVtQ2hhcnMgPD0gMCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJ1ZltjdXJDaGFyKytdOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCByZWFkSW50KCkKICAgICAgICB7CiAgICAgICAgICAgIGludCBjID0gcmVhZCgpOwogICAgICAgICAgICB3aGlsZSAoaXNTcGFjZUNoYXIoYykpCiAgICAgICAgICAgICAgICBjID0gcmVhZCgpOwogICAgICAgICAgICBpbnQgc2duID0gMTsKICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZ24gPSAtMTsKICAgICAgICAgICAgICAgIGMgPSByZWFkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHJlcyA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElucHV0TWlzbWF0Y2hFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgIHJlcyAqPSAxMDsKICAgICAgICAgICAgICAgIHJlcyArPSBjIC0gJzAnOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfSB3aGlsZSAoIWlzU3BhY2VDaGFyKGMpKTsKICAgICAgICAgICAgcmV0dXJuIHJlcyAqIHNnbjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpCiAgICAgICAgewogICAgICAgICAgICBpbnQgYyA9IHJlYWQoKTsKICAgICAgICAgICAgd2hpbGUgKGlzU3BhY2VDaGFyKGMpKQogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kQ29kZVBvaW50KGMpOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfSB3aGlsZSAoIWlzU3BhY2VDaGFyKGMpKTsKICAgICAgICAgICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkKICAgICAgICB7CiAgICAgICAgICAgIGludCBjID0gcmVhZCgpOwogICAgICAgICAgICB3aGlsZSAoaXNTcGFjZUNoYXIoYykpCiAgICAgICAgICAgICAgICBjID0gcmVhZCgpOwogICAgICAgICAgICBpbnQgc2duID0gMTsKICAgICAgICAgICAgaWYgKGMgPT0gJy0nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzZ24gPSAtMTsKICAgICAgICAgICAgICAgIGMgPSByZWFkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG91YmxlIHJlcyA9IDA7CiAgICAgICAgICAgIHdoaWxlICghaXNTcGFjZUNoYXIoYykgJiYgYyAhPSAnLicpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzICogTWF0aC5wb3coMTAsIHJlYWRJbnQoKSk7CiAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnB1dE1pc21hdGNoRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICByZXMgKj0gMTA7CiAgICAgICAgICAgICAgICByZXMgKz0gYyAtICcwJzsKICAgICAgICAgICAgICAgIGMgPSByZWFkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMgPT0gJy4nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjID0gcmVhZCgpOwogICAgICAgICAgICAgICAgZG91YmxlIG0gPSAxOwogICAgICAgICAgICAgICAgd2hpbGUgKCFpc1NwYWNlQ2hhcihjKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgKiBNYXRoLnBvdygxMCwgcmVhZEludCgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYyA8ICcwJyB8fCBjID4gJzknKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpOwogICAgICAgICAgICAgICAgICAgIG0gLz0gMTA7CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IChjIC0gJzAnKSAqIG07CiAgICAgICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzICogc2duOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGxvbmcgcmVhZExvbmcoKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGMgPSByZWFkKCk7CiAgICAgICAgICAgIHdoaWxlIChpc1NwYWNlQ2hhcihjKSkKICAgICAgICAgICAgICAgIGMgPSByZWFkKCk7CiAgICAgICAgICAgIGludCBzZ24gPSAxOwogICAgICAgICAgICBpZiAoYyA9PSAnLScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNnbiA9IC0xOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb25nIHJlcyA9IDA7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElucHV0TWlzbWF0Y2hFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgIHJlcyAqPSAxMDsKICAgICAgICAgICAgICAgIHJlcyArPSBjIC0gJzAnOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfSB3aGlsZSAoIWlzU3BhY2VDaGFyKGMpKTsKICAgICAgICAgICAgcmV0dXJuIHJlcyAqIHNnbjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3BhY2VDaGFyKGludCBjKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5pc1NwYWNlQ2hhcihjKTsKICAgICAgICAgICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXHQnIHx8IGMgPT0gLTE7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgU3RyaW5nIG5leHQoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgU3BhY2VDaGFyRmlsdGVyCiAgICAgICAgewogICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlQ2hhcihpbnQgY2gpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPdXRwdXRXcml0ZXIKICAgIHsKICAgICAgICBwcml2YXRlIGZpbmFsIFByaW50V3JpdGVyIHdyaXRlcjsKCiAgICAgICAgcHVibGljIE91dHB1dFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKQogICAgICAgIHsKICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSkpKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBPdXRwdXRXcml0ZXIoV3JpdGVyIHdyaXRlcikKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMud3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3QuLi4gb2JqZWN0cykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkKICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChvYmplY3RzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgcHJpbnRMaW5lKE9iamVjdC4uLiBvYmplY3RzKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnQob2JqZWN0cyk7CiAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgICAgewogICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkKICAgICAgICB7CiAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwogICAgICAgIH0KICAgIH0KfQ==