提交 ca2da649 编写于 作者: J jingqinghe

update

上级 15eacc08
......@@ -20,7 +20,7 @@ import sys
import sysconfig
import paddle.fluid as fluid
_paddle_enc_root = sysconfig.get_paths()["purelib"] + "/paddle_encrypted"
_paddle_enc_root = sysconfig.get_paths()["purelib"] + "/paddle_fl/mpc"
_paddle_enc_lib_path = _paddle_enc_root + '/libs'
_paddle_enc_lib = _paddle_enc_lib_path + '/libpaddle_enc.so'
......
......@@ -21,15 +21,15 @@ import env_set
import sys
import numpy as np
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
# call mpc add
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
data_1 = paddle_enc.data(name='data_1', shape=[8], dtype='int64')
data_2 = paddle_enc.data(name='data_2', shape=[8], dtype='int64')
data_1 = pfl_mpc.data(name='data_1', shape=[8], dtype='int64')
data_2 = pfl_mpc.data(name='data_2', shape=[8], dtype='int64')
d_1 = np.array(
[[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7]]).astype('int64')
......
......@@ -22,13 +22,13 @@ import time
import sys
import numpy as np
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
data_1 = paddle_enc.data(name='data_1', shape=[2, 2], dtype='int64')
data_1 = pfl_mpc.data(name='data_1', shape=[2, 2], dtype='int64')
data_2 = fluid.data(name='data_2', shape=[1, 2, 2], dtype='float32')
out_gt = data_1 > data_2
......
......@@ -20,12 +20,12 @@ import env_set
import sys
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
# call mpc init
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
exe = fluid.Executor(place=fluid.CPUPlace())
exe.run()
......
......@@ -22,22 +22,22 @@ import time
import sys
import numpy as np
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
# call mpc add
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
data_1 = paddle_enc.data(name='data_1', shape=[2, 2], dtype='int64')
data_2 = paddle_enc.data(name='data_2', shape=[2, 2], dtype='int64')
data_1 = pfl_mpc.data(name='data_1', shape=[2, 2], dtype='int64')
data_2 = pfl_mpc.data(name='data_2', shape=[2, 2], dtype='int64')
data_3 = fluid.data(name='data_3', shape=[1, 2, 2], dtype='int64')
out_sub = data_1 - data_2
out_mul = paddle_enc.layers.mul(x=data_1, y=data_2)
out_mean = paddle_enc.layers.mean(x=data_1)
out_square = paddle_enc.layers.square(x=data_1)
out_sum = paddle_enc.layers.sum([data_1, data_2])
out_mul = pfl_mpc.layers.mul(x=data_1, y=data_2)
out_mean = pfl_mpc.layers.mean(x=data_1)
out_square = pfl_mpc.layers.square(x=data_1)
out_sum = pfl_mpc.layers.sum([data_1, data_2])
d_1 = np.array([[[10, 10], [10, 10]], [[10, 10], [10, 10]]]).astype('int64')
d_2 = np.array([[[5, 5], [5, 5]], [[5, 5], [5, 5]]]).astype('int64')
......
......@@ -22,18 +22,18 @@ import time
import sys
import numpy as np
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
data_1 = paddle_enc.data(name='data_1', shape=[2, 2], dtype='int64')
data_2 = paddle_enc.data(name='data_2', shape=[2, 2], dtype='int64')
data_1 = pfl_mpc.data(name='data_1', shape=[2, 2], dtype='int64')
data_2 = pfl_mpc.data(name='data_2', shape=[2, 2], dtype='int64')
out_sec = paddle_enc.layers.square_error_cost(input=data_1, label=data_2)
out_fc = paddle_enc.layers.fc(input=data_1, size=1, act=None)
out_relu = paddle_enc.layers.relu(data_1)
out_sec = pfl_mpc.layers.square_error_cost(input=data_1, label=data_2)
out_fc = pfl_mpc.layers.fc(input=data_1, size=1, act=None)
out_relu = pfl_mpc.layers.relu(data_1)
d_1 = np.array([[[10, 10], [10, 10]], [[10, 10], [10, 10]]]).astype('int64')
d_2 = np.array([[[5, 5], [5, 5]], [[5, 5], [5, 5]]]).astype('int64')
......
......@@ -15,25 +15,25 @@
import env_set
import numpy as np
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
role, server, port = env_set.TestOptions().values()
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
batch_size = 3
# x is in cypher text type
x = paddle_enc.data(name='x', shape=[batch_size, 8], dtype='int64')
x = pfl_mpc.data(name='x', shape=[batch_size, 8], dtype='int64')
# y is in cypher text type
y = paddle_enc.data(name='y', shape=[batch_size, 1], dtype='int64')
y = pfl_mpc.data(name='y', shape=[batch_size, 1], dtype='int64')
y_pre = paddle_enc.layers.fc(input=x, size=1, act=None)
y_relu = paddle_enc.layers.relu(input=y_pre)
cost = paddle_enc.layers.square_error_cost(input=y_relu, label=y)
avg_loss = paddle_enc.layers.mean(cost)
y_pre = pfl_mpc.layers.fc(input=x, size=1, act=None)
y_relu = pfl_mpc.layers.relu(input=y_pre)
cost = pfl_mpc.layers.square_error_cost(input=y_relu, label=y)
avg_loss = pfl_mpc.layers.mean(cost)
optimizer = paddle_enc.optimizer.SGD(learning_rate=0.001)
optimizer = pfl_mpc.optimizer.SGD(learning_rate=0.001)
optimizer.minimize(avg_loss)
exe = fluid.Executor(place=fluid.CPUPlace())
......
......@@ -17,7 +17,7 @@ Prepare of UCI housing data for MPC usage
import numpy as np
import paddle
import six
from paddle_encrypted.data_utils import aby3
from paddle_fl.mpc.data_utils import aby3
sample_reader = paddle.dataset.uci_housing.train()
......
......@@ -20,11 +20,11 @@ import time
import paddle
import paddle.fluid as fluid
import paddle_encrypted as paddle_enc
import paddle_encrypted.data_utils.aby3 as aby3
import paddle_fl.mpc as pfl_mpc
import paddle_fl.mpc.data_utils.aby3 as aby3
role, server, port = env_set.TestOptions().values()
paddle_enc.init("aby3", int(role), "localhost", server, int(port))
pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
role = int(role)
# data preprocessing
......@@ -36,8 +36,8 @@ label_reader = aby3.load_aby3_shares("/tmp/house_label", id=role, shape=(1, ))
batch_feature = aby3.batch(feature_reader, BATCH_SIZE, drop_last=True)
batch_label = aby3.batch(label_reader, BATCH_SIZE, drop_last=True)
x = paddle_enc.data(name='x', shape=[BATCH_SIZE, 13], dtype='int64')
y = paddle_enc.data(name='y', shape=[BATCH_SIZE, 1], dtype='int64')
x = pfl_mpc.data(name='x', shape=[BATCH_SIZE, 13], dtype='int64')
y = pfl_mpc.data(name='y', shape=[BATCH_SIZE, 1], dtype='int64')
# async data loader
loader = fluid.io.DataLoader.from_generator(
......@@ -47,13 +47,13 @@ place = fluid.CPUPlace()
loader.set_batch_generator(batch_sample, places=place)
# network
y_pre = paddle_enc.layers.fc(input=x, size=1)
y_pre = pfl_mpc.layers.fc(input=x, size=1)
infer_program = fluid.default_main_program().clone(for_test=False)
cost = paddle_enc.layers.square_error_cost(input=y_pre, label=y)
avg_loss = paddle_enc.layers.mean(cost)
optimizer = paddle_enc.optimizer.SGD(learning_rate=0.001)
cost = pfl_mpc.layers.square_error_cost(input=y_pre, label=y)
avg_loss = pfl_mpc.layers.mean(cost)
optimizer = pfl_mpc.optimizer.SGD(learning_rate=0.001)
optimizer.minimize(avg_loss)
# loss file
......
......@@ -20,8 +20,7 @@ sys.path.append('../../../')
import unittest
import paddle_encrypted as paddle_enc
import paddle_fl.mpc as pfl_mpc
class TestDataUtilsLoadFilter(unittest.TestCase):
def __init__(self, methodName='runTest'):
......@@ -46,7 +45,7 @@ class TestDataUtilsLoadFilter(unittest.TestCase):
def test_load_data(self):
expected_values = ['111', '222', '333']
du = fluid_enc.data_utils.DataUtils()
du = pfl_mpc.data_utils.DataUtils()
for data, value in zip(
du.load_data(self.test_tmp_file), expected_values):
self.assertEqual(data, value)
......@@ -57,7 +56,7 @@ class TestDataUtilsLoadFilter(unittest.TestCase):
]
id_list = [0, 2]
expected_results = ["0, 0.1, 0.1, 0.1, 1", "2, 0.3, 0.3, 0.3, 1"]
du = fluid_enc.data_utils.DataUtils()
du = pfl_mpc.data_utils.DataUtils()
filter_results = du.data_filter_by_id(
input_list=to_filter, id_list=id_list)
for result, expect in zip(filter_results, expected_results):
......
......@@ -21,8 +21,8 @@ import numpy as np
import os
import shutil
import unittest
import paddle_encrypted as paddle_enc
import paddle_encrypted.data_utils.aby3 as aby3
import paddle_fl.mpc as pfl_mpc
import paddle_fl.mpc.data_utils.aby3 as aby3
import paddle.fluid as fluid
from paddle.fluid.param_attr import ParamAttr
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle.fluid as fluid
from paddle_fl.core.scheduler.agent_master import FLServerAgent
from paddle_fl..jingqinghe_newname.core.scheduler.agent_master import FLServerAgent
class FLServer(object):
......
......@@ -13,7 +13,7 @@
# limitations under the License.
import paddle.fluid as fluid
import logging
from paddle_fl.core.scheduler.agent_master import FLWorkerAgent
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLWorkerAgent
import numpy
import hmac
import hashlib
......
......@@ -13,9 +13,9 @@
# limitations under the License.
import paddle.fluid as fluid
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
class Model(object):
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
worker_num = 2
server_num = 1
......
......@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
server = FLServer()
server_id = 0
job_path = "fl_job_config"
......
......@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle.fluid as fluid
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import numpy as np
import sys
import logging
......
......@@ -13,9 +13,9 @@
# limitations under the License.
import paddle.fluid as fluid
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
import math
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
......
......@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import numpy
import sys
import paddle
......
......@@ -13,9 +13,9 @@
# limitations under the License.
import paddle.fluid as fluid
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
class Model(object):
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
worker_num = 4
server_num = 1
......
......@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
server = FLServer()
server_id = 0
job_path = "fl_job_config"
......
......@@ -12,9 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
import paddle_fl.dataset.femnist
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import paddle_fl.jingqinghe_newname.dataset.femnist
import numpy
import sys
import paddle
......
......@@ -13,9 +13,9 @@
# limitations under the License.
import paddle.fluid as fluid
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
class Model(object):
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
worker_num = 4
server_num = 1
......
......@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
server = FLServer()
server_id = 0
job_path = "fl_job_config"
......
......@@ -12,9 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.reader.gru4rec_reader import Gru4rec_Reader
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.reader.gru4rec_reader import Gru4rec_Reader
import paddle.fluid as fluid
import numpy as np
import sys
......
......@@ -15,9 +15,9 @@
import argparse
import paddle.fluid as fluid
import os
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
def parse_args():
......
......@@ -13,7 +13,7 @@
# limitations under the License.
import argparse
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
def parse_args():
......
......@@ -12,11 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import os
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import time
server = FLServer()
server_id = 0
......
......@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle.fluid as fluid
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import numpy as np
import sys
import os
......
......@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle.fluid as fluid
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import numpy as np
import sys
import os
......
......@@ -13,9 +13,9 @@
# limitations under the License.
import paddle.fluid as fluid
import paddle_fl as fl
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
import paddle_fl.jingqinghe_newname as fl
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
class Model(object):
......
......@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
worker_num = 2
server_num = 1
......
......@@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
server = FLServer()
server_id = 0
job_path = "fl_job_config"
......
......@@ -12,8 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
import numpy
import sys
import logging
......
......@@ -18,11 +18,11 @@ import random
import zmq
import time
import sys
from paddle_fl.core.submitter.client_base import HPCClient
from paddle_fl.core.scheduler.agent_master import FLScheduler
from paddle_fl.jingqinghe_newname.core.submitter.client_base import HPCClient
from paddle_fl.jingqinghe_newname.core.scheduler.agent_master import FLScheduler
import paddle.fluid as fluid
from paddle_fl.core.master.job_generator import JobGenerator
from paddle_fl.core.strategy.fl_strategy_base import FLStrategyFactory
from paddle_fl.jingqinghe_newname.core.master.job_generator import JobGenerator
from paddle_fl.jingqinghe_newname.core.strategy.fl_strategy_base import FLStrategyFactory
from model import Model
import tarfile
......
......@@ -17,11 +17,11 @@ import random
import zmq
import os
import tarfile
import paddle_fl as fl
import paddle_fl.jingqinghe_newname as fl
import paddle.fluid as fluid
from paddle_fl.core.server.fl_server import FLServer
from paddle_fl.core.master.fl_job import FLRunTimeJob
from paddle_fl.core.trainer.fl_trainer import FLTrainerFactory
from paddle_fl.jingqinghe_newname.core.server.fl_server import FLServer
from paddle_fl.jingqinghe_newname.core.master.fl_job import FLRunTimeJob
from paddle_fl.jingqinghe_newname.core.trainer.fl_trainer import FLTrainerFactory
import numpy as np
import sys
import logging
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册