/*
* @Author: hungeazy
* @Date: 2025-12-07 17:30:08
* @Last Modified by: hungeazy
* @Last Modified time: 2025-12-07 23:25:04
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
bool M1;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name "TAODULIEU"
#define endl '\n'
#define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
const int N = (int)3e5+10;
int n;
vi g[N];
ii edge[N];
namespace sub14 {
bool visited[N];
bool approved() {
return n <= 100;
}
void solve(void)
{
int ans = 0;
FOR(L,1,n)
FOR(R,L,n)
{
if (L == 1 and R == n) continue;
int len = R-L+1;
FOR(i,1,n) visited[i] = false;
queue<int> q;
q.push(L);
visited[L] = true;
int cnt = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
++cnt;
for (int v : g[u])
if (!visited[v] and v >= L and v <= R)
{
visited[v] = true;
q.push(v);
}
}
ans += (cnt == len);
}
cout << ans;
}
}
namespace sub25 {
int par[N],sz[N];
bool approved() {
return n <= 5e3;
}
struct DSU {
int n;
DSU() {};
DSU(int _n):
n(_n) {};
void init()
{
FOR(i,1,n)
{
par[i] = -1;
sz[i] = 0;
}
}
void makeSet(int x)
{
par[x] = x;
sz[x] = 1;
}
int acs(int u) {
if (par[u] == -1) return -1;
return (u == par[u] ? u : par[u] = acs(par[u]));
}
bool join(int u, int v)
{
int x = acs(u), y = acs(v);
if (x == -1 or y == -1) return false;
if (x != y)
{
if (sz[x] < sz[y]) swap(x,y);
sz[x] += sz[y];
par[y] = x;
return true;
}
return false;
}
} dsu;
void solve(void)
{
dsu = DSU(n);
int ans = 0;
FOR(L,1,n)
{
dsu.init();
int tplt = 0;
FOR(R,L,n)
{
dsu.makeSet(R);
tplt++;
for (int v : g[R])
if (v >= L and v <= R-1)
tplt -= (dsu.join(R,v));
if (tplt == 1)
ans += !(L == 1 and R == n);
}
}
cout << ans;
}
}
namespace sub36 {
vi G[N];
struct SegmentTree {
vi lazy,cnt,mx;
int n;
SegmentTree() {};
SegmentTree(int _n):
n(_n), lazy((_n<<2)+1,0), cnt((_n<<2)+1,0), mx((_n<<2)+1,0) {};
void down(int id)
{
if (!lazy[id]) return;
int &k = lazy[id];
for (int i : {id<<1,id<<1|1})
{
mx[i] += k;
lazy[i] += k;
}
k = 0;
}
void build(int id, int l, int r)
{
if (l == r)
{
mx[id] = -l;
cnt[id] = 1;
return;
}
int mid = (l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
cnt[id] = 0;
if (mx[id<<1] >= mx[id<<1|1])
{
mx[id] = mx[id<<1];
cnt[id] += cnt[id<<1];
}
if (mx[id<<1] <= mx[id<<1|1])
{
mx[id] = mx[id<<1|1];
cnt[id] += cnt[id<<1|1];
}
}
void update(int id, int l, int r, int u, int v, int val)
{
if (l > v or r < u) return;
if (l >= u and r <= v)
{
mx[id] += val;
lazy[id] += val;
return;
}
int mid = (l+r)>>1; down(id);
update(id<<1,l,mid,u,v,val);
update(id<<1|1,mid+1,r,u,v,val);
cnt[id] = 0;
if (mx[id<<1] >= mx[id<<1|1])
{
mx[id] = mx[id<<1];
cnt[id] += cnt[id<<1];
}
if (mx[id<<1] <= mx[id<<1|1])
{
mx[id] = mx[id<<1|1];
cnt[id] += cnt[id<<1|1];
}
}
int get(int id, int l, int r, int u, int v, int val)
{
if (l > v or r < u) return 0;
if (l >= u and r <= v) return (mx[id] == val ? cnt[id] : 0);
int mid = (l+r)>>1; down(id);
return get(id<<1,l,mid,u,v,val)+get(id<<1|1,mid+1,r,u,v,val);
}
} IT;
void solve(void)
{
IT = SegmentTree(n);
IT.build(1,1,n);
int ans = 0;
FOR(i,1,n-1)
{
auto [u,v] = edge[i];
G[min(u,v)].pb(max(u,v));
IT.update(1,1,n,max(u,v),n,1);
}
FOR(L,1,n)
{
ans += IT.get(1,1,n,L,n,-L);
for (int v : G[L])
IT.update(1,1,n,v,n,-1);
}
cout << ans-1;
}
}
bool M2;
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n;
FOR(i,1,n-1)
{
int u,v;
cin >> u >> v;
edge[i] = {u,v};
g[u].pb(v); g[v].pb(u);
}
if (sub14::approved()) return sub14::solve(), time(), memory(), 0;
if (sub25::approved()) return sub25::solve(), time(), memory(), 0;
sub36::solve();
time();
memory();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjUtMTItMDcgMTc6MzA6MDgKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjUtMTItMDcgMjM6MjU6MDQKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCmJvb2wgTTE7CiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiVEFPRFVMSUVVIgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIG1lbW9yeSgpIGNlcnIgPDwgYWJzKCZNMi0mTTEpLzEwMjQuMC8xMDI0IDw8ICIgTUIiIDw8IGVuZGwKI2RlZmluZSB0aW1lKCkgY2VyciA8PCBlbmRsIDw8ICItLS0tLS0tLS0tLS0tVGltZToiIDw8IDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQyA8PCAibXMuIiA8PCBlbmRsCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA8IHZhbCl7IHJlcyA9IHZhbDsgcmV0dXJuIHRydWU7IH07IHJldHVybiBmYWxzZTsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1pbmltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPiB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IHVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZSA8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsIDxUPiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKY29uc3QgaW50IE4gPSAoaW50KTNlNSsxMDsKaW50IG47CnZpIGdbTl07CmlpIGVkZ2VbTl07CgpuYW1lc3BhY2Ugc3ViMTQgewoKCWJvb2wgdmlzaXRlZFtOXTsKCglib29sIGFwcHJvdmVkKCkgewoJCXJldHVybiBuIDw9IDEwMDsKCX0KCgl2b2lkIHNvbHZlKHZvaWQpCgl7CgkJaW50IGFucyA9IDA7CgkJRk9SKEwsMSxuKQoJCQlGT1IoUixMLG4pCgkJCXsKCQkJCWlmIChMID09IDEgYW5kIFIgPT0gbikgY29udGludWU7CgkJCQlpbnQgbGVuID0gUi1MKzE7CgkJCQlGT1IoaSwxLG4pIHZpc2l0ZWRbaV0gPSBmYWxzZTsKCQkJCXF1ZXVlPGludD4gcTsKCQkJCXEucHVzaChMKTsKCQkJCXZpc2l0ZWRbTF0gPSB0cnVlOwoJCQkJaW50IGNudCA9IDA7CgkJCQl3aGlsZSAoIXEuZW1wdHkoKSkKCQkJCXsKCQkJCQlpbnQgdSA9IHEuZnJvbnQoKTsKCQkJCQlxLnBvcCgpOwoJCQkJCSsrY250OwoJCQkJCWZvciAoaW50IHYgOiBnW3VdKQoJCQkJCQlpZiAoIXZpc2l0ZWRbdl0gYW5kIHYgPj0gTCBhbmQgdiA8PSBSKQoJCQkJCQl7CgkJCQkJCQl2aXNpdGVkW3ZdID0gdHJ1ZTsKCQkJCQkJCXEucHVzaCh2KTsKCQkJCQkJfQoJCQkJfQoJCQkJYW5zICs9IChjbnQgPT0gbGVuKTsKCQkJfQoJCWNvdXQgPDwgYW5zOwoJfQoJCn0KCm5hbWVzcGFjZSBzdWIyNSB7CgoJaW50IHBhcltOXSxzeltOXTsKCglib29sIGFwcHJvdmVkKCkgewoJCXJldHVybiBuIDw9IDVlMzsKCX0KCglzdHJ1Y3QgRFNVIHsKCQlpbnQgbjsKCgkJRFNVKCkge307CgkJRFNVKGludCBfbik6CgkJCW4oX24pIHt9OwoKCQl2b2lkIGluaXQoKQoJCXsKCQkJRk9SKGksMSxuKQoJCQl7CgkJCQlwYXJbaV0gPSAtMTsKCQkJCXN6W2ldID0gMDsKCQkJfQoJCX0gCgoJCXZvaWQgbWFrZVNldChpbnQgeCkKCQl7CgkJCXBhclt4XSA9IHg7CgkJCXN6W3hdID0gMTsKCQl9CgoJCWludCBhY3MoaW50IHUpIHsKCQkJaWYgKHBhclt1XSA9PSAtMSkgcmV0dXJuIC0xOwoJCQlyZXR1cm4gKHUgPT0gcGFyW3VdID8gdSA6IHBhclt1XSA9IGFjcyhwYXJbdV0pKTsKCQl9CgoJCWJvb2wgam9pbihpbnQgdSwgaW50IHYpCgkJewoJCQlpbnQgeCA9IGFjcyh1KSwgeSA9IGFjcyh2KTsKCQkJaWYgKHggPT0gLTEgb3IgeSA9PSAtMSkgcmV0dXJuIGZhbHNlOwoJCQlpZiAoeCAhPSB5KQoJCQl7CgkJCQlpZiAoc3pbeF0gPCBzelt5XSkgc3dhcCh4LHkpOwoJCQkJc3pbeF0gKz0gc3pbeV07CgkJCQlwYXJbeV0gPSB4OwoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0gZHN1OwoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQlkc3UgPSBEU1Uobik7CgkJaW50IGFucyA9IDA7CgkJRk9SKEwsMSxuKQoJCXsKCQkJZHN1LmluaXQoKTsKCQkJaW50IHRwbHQgPSAwOwoJCQlGT1IoUixMLG4pCgkJCXsKCQkJCWRzdS5tYWtlU2V0KFIpOwoJCQkJdHBsdCsrOwoJCQkJZm9yIChpbnQgdiA6IGdbUl0pCgkJCQkJaWYgKHYgPj0gTCBhbmQgdiA8PSBSLTEpCgkJCQkJCXRwbHQgLT0gKGRzdS5qb2luKFIsdikpOwoJCQkJaWYgKHRwbHQgPT0gMSkKCQkJCQlhbnMgKz0gIShMID09IDEgYW5kIFIgPT0gbik7CgkJCX0KCQl9CgkJY291dCA8PCBhbnM7Cgl9Cgp9CgpuYW1lc3BhY2Ugc3ViMzYgewoKCXZpIEdbTl07CgoJc3RydWN0IFNlZ21lbnRUcmVlIHsKCQl2aSBsYXp5LGNudCxteDsKCQlpbnQgbjsKCgkJU2VnbWVudFRyZWUoKSB7fTsKCQlTZWdtZW50VHJlZShpbnQgX24pOgoJCQluKF9uKSwgbGF6eSgoX248PDIpKzEsMCksIGNudCgoX248PDIpKzEsMCksIG14KChfbjw8MikrMSwwKSB7fTsKCgkJdm9pZCBkb3duKGludCBpZCkKCQl7CgkJCWlmICghbGF6eVtpZF0pIHJldHVybjsKCQkJaW50ICZrID0gbGF6eVtpZF07CgkJCWZvciAoaW50IGkgOiB7aWQ8PDEsaWQ8PDF8MX0pCgkJCXsKCQkJCW14W2ldICs9IGs7CgkJCQlsYXp5W2ldICs9IGs7CgkJCX0KCQkJayA9IDA7CgkJfQoKCQl2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKQoJCXsKCQkJaWYgKGwgPT0gcikKCQkJewoJCQkJbXhbaWRdID0gLWw7CgkJCQljbnRbaWRdID0gMTsKCQkJCXJldHVybjsKCQkJfQoJCQlpbnQgbWlkID0gKGwrcik+PjE7CgkJCWJ1aWxkKGlkPDwxLGwsbWlkKTsKCQkJYnVpbGQoaWQ8PDF8MSxtaWQrMSxyKTsKCQkJY250W2lkXSA9IDA7CgkJCWlmIChteFtpZDw8MV0gPj0gbXhbaWQ8PDF8MV0pCgkJCXsKCQkJCW14W2lkXSA9IG14W2lkPDwxXTsKCQkJCWNudFtpZF0gKz0gY250W2lkPDwxXTsKCQkJfQoJCQlpZiAobXhbaWQ8PDFdIDw9IG14W2lkPDwxfDFdKQoJCQl7CgkJCQlteFtpZF0gPSBteFtpZDw8MXwxXTsKCQkJCWNudFtpZF0gKz0gY250W2lkPDwxfDFdOwoJCQl9CgkJfQoKCQl2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgdmFsKQoJCXsKCQkJaWYgKGwgPiB2IG9yIHIgPCB1KSByZXR1cm47CgkJCWlmIChsID49IHUgYW5kIHIgPD0gdikKCQkJewoJCQkJbXhbaWRdICs9IHZhbDsKCQkJCWxhenlbaWRdICs9IHZhbDsKCQkJCXJldHVybjsKCQkJfQoJCQlpbnQgbWlkID0gKGwrcik+PjE7IGRvd24oaWQpOwoJCQl1cGRhdGUoaWQ8PDEsbCxtaWQsdSx2LHZhbCk7CgkJCXVwZGF0ZShpZDw8MXwxLG1pZCsxLHIsdSx2LHZhbCk7CgkJCWNudFtpZF0gPSAwOwoJCQlpZiAobXhbaWQ8PDFdID49IG14W2lkPDwxfDFdKQoJCQl7CgkJCQlteFtpZF0gPSBteFtpZDw8MV07CgkJCQljbnRbaWRdICs9IGNudFtpZDw8MV07CgkJCX0KCQkJaWYgKG14W2lkPDwxXSA8PSBteFtpZDw8MXwxXSkKCQkJewoJCQkJbXhbaWRdID0gbXhbaWQ8PDF8MV07CgkJCQljbnRbaWRdICs9IGNudFtpZDw8MXwxXTsKCQkJfQoJCX0KCgkJaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgdmFsKQoJCXsKCQkJaWYgKGwgPiB2IG9yIHIgPCB1KSByZXR1cm4gMDsKCQkJaWYgKGwgPj0gdSBhbmQgciA8PSB2KSByZXR1cm4gKG14W2lkXSA9PSB2YWwgPyBjbnRbaWRdIDogMCk7CgkJCWludCBtaWQgPSAobCtyKT4+MTsgZG93bihpZCk7CgkJCXJldHVybiBnZXQoaWQ8PDEsbCxtaWQsdSx2LHZhbCkrZ2V0KGlkPDwxfDEsbWlkKzEscix1LHYsdmFsKTsKCQl9Cgl9IElUOwoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQlJVCA9IFNlZ21lbnRUcmVlKG4pOwoJCUlULmJ1aWxkKDEsMSxuKTsKCQlpbnQgYW5zID0gMDsKCQlGT1IoaSwxLG4tMSkgCgkJewoJCQlhdXRvIFt1LHZdID0gZWRnZVtpXTsKCQkJR1ttaW4odSx2KV0ucGIobWF4KHUsdikpOwoJCQlJVC51cGRhdGUoMSwxLG4sbWF4KHUsdiksbiwxKTsKCQl9CgkJRk9SKEwsMSxuKQoJCXsKCQkJYW5zICs9IElULmdldCgxLDEsbixMLG4sLUwpOwoJCQlmb3IgKGludCB2IDogR1tMXSkKCQkJCUlULnVwZGF0ZSgxLDEsbix2LG4sLTEpOwoJCX0KCQljb3V0IDw8IGFucy0xOwoJfQoKfQoKYm9vbCBNMjsKc2lnbmVkIG1haW4oKQp7CiAgICBmYXN0OwogICAgaWYgKGZvcGVuKG5hbWUiLmlucCIsInIiKSkKICAgIHsKICAgIAlmcmVvcGVuKG5hbWUiLmlucCIsInIiLHN0ZGluKTsKICAgIAlmcmVvcGVuKG5hbWUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4gPj4gbjsKICAgIEZPUihpLDEsbi0xKQogICAgewogICAgCWludCB1LHY7CiAgICAJY2luID4+IHUgPj4gdjsKICAgIAllZGdlW2ldID0ge3Usdn07CiAgICAJZ1t1XS5wYih2KTsgZ1t2XS5wYih1KTsKICAgIH0KICAgIGlmIChzdWIxNDo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjE0Ojpzb2x2ZSgpLCB0aW1lKCksIG1lbW9yeSgpLCAwOwogICAgaWYgKHN1YjI1OjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMjU6OnNvbHZlKCksIHRpbWUoKSwgbWVtb3J5KCksIDA7CiAgICBzdWIzNjo6c29sdmUoKTsKICAgIHRpbWUoKTsKICAgIG1lbW9yeSgpOwogICAgcmV0dXJuIDA7Cn0KLy8g4paI4paI4paRIOKWiOKWiCAg4paIICAgIOKWiOKWiCAg4paI4paI4paI4paEICAgIOKWiCAgIOKWhOKWiOKWiOKWiOKWiAovL+KWk+KWiOKWiOKWkSDilojilojilpIg4paI4paIICDilpPilojilojilpIg4paI4paIIOKWgOKWiCAgIOKWiCAg4paI4paI4paSIOKWgOKWiOKWkgovL+KWkuKWiOKWiOKWgOKWgOKWiOKWiOKWkeKWk+KWiOKWiCAg4paS4paI4paI4paR4paT4paI4paIICDiloDilogg4paI4paI4paS4paS4paI4paI4paR4paE4paE4paE4paRCi8v4paR4paT4paIIOKWkeKWiOKWiCDilpPilpPiloggIOKWkeKWiOKWiOKWkeKWk+KWiOKWiOKWkiAg4paQ4paM4paI4paI4paS4paR4paT4paIICDilojilojilpMKLy/ilpHilpPilojilpLilpHilojilojilpPilpLilpLilojilojilojilojilojilpMg4paS4paI4paI4paRICAg4paT4paI4paI4paR4paR4paS4paT4paI4paI4paI4paA4paSCi8vIOKWkiDilpHilpHilpLilpHilpLilpHilpLilpPilpIg4paSIOKWkiDilpEg4paS4paRICAg4paSIOKWkiAg4paR4paSICAg4paSCi8vIOKWkiDilpHilpLilpEg4paR4paR4paR4paS4paRIOKWkSDilpEg4paRIOKWkeKWkSAgIOKWkSDilpLilpEgIOKWkSAgIOKWkQovLyDilpEgIOKWkeKWkSDilpEg4paR4paR4paRIOKWkSDilpEgICAg4paRICAg4paRIOKWkSDilpEg4paRICAg4paRCi8vIOKWkSAg4paRICDilpEgICDilpEgICAgICAgICAgICAgIOKWkSAgICAgICDilpE=