#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int start,end,len;
};
vector<node>v;
bool cmp(node n1,node n2){
if(n1.len!=n2.len) return n1.len>n2.len;
else return n1.start<n2.start;
}
void address(string &s){
v.clear();
//1.去除前缀0,将其化为形如0:0:12:0:0:0:2134:0的形式
for(int i=0;i<s.size();i++){
if(s[i]=='0'&&i==0){//处理首项为0的特殊情况
int j=i;
while(j<i+3){
if(s[j]=='0') j++;
else break;
}
s.erase(s.begin()+i,s.begin()+j);
}
else if(s[i]=='0'&&s[i-1]==':'){
int j=i;
while(j<i+3){
if(s[j]=='0') j++;
else break;
}
s.erase(s.begin()+i,s.begin()+j);
}
}
//2.将最长的0:0:....表示为::
for(int i=0;i<s.size();i++){
if(i==0&&s[i]=='0'&&s[i+1]==':'){//处理首项为0:的特殊情况
int j=i;
while(s[j]=='0'&&j<s.size()) j+=2;
j=j-2;
v.push_back({i,j,j-i+1});
i=j;
}
else if(s[i]==':'&&s[i+1]=='0'){
i++;
int j=i;
while(s[j]=='0'&&j<s.size()) j+=2;
j=j-2;
v.push_back({i,j,j-i+1});
i=j;
}
}
if(v.empty()) return;
sort(v.begin(),v.end(),cmp);
s.erase(s.begin()+v[0].start,s.begin()+v[0].end+1);
//3.处理三种特殊情况
if(s.size()==0) {
s="::";
return;
}
if(s[s.size()-1]==':') s.push_back(':');
if(s[0]==':'&&s[1]!=':') s.insert(0,":");
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
address(s);
cout<<s<<endl;
}
return 0;
}
/*
测试数据:
7
2001:0db8:0000:0000:0001:0000:0000:0000
2001:0db8:0000:0000:ffff:0000:0000:0001
240e:0014:6000:0000:0000:0000:0000:0001
0000:0000:0000:0000:0000:0000:0000:0000
0000:0000:0000:0000:0000:0000:0001:0002
2400:8900:e000:0010:0000:0000:0000:0000
1234:5678:9abc:def0:1234:5678:9abc:def0
*/
09-12
3258
