<?php
namespace common\modules\registration\models;
use backend\modules\event\models\Event;
use backend\modules\profile\models\Profile;
use backend\modules\registration\models\query\RegEventQuery;
use common\models\User;
use common\modules\registration\Registration;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\helpers\ArrayHelper;
/**
* This is the model class for table "reg_event".
*
* @property int $id
* @property int $number Номер участника
* @property int $user_id
* @property int $event_id
* @property int $rang_id
* @property int $discipline_id
* @property int $nomination_id
* @property int $category_id
* @property int $status Не оплачено, Оплачено, Отменено
* @property int $visit Посетил, не посетил
* @property int $created_at
* @property int $updated_at
*
* @property RegEventCategory $category
* @property RegEventDiscipline $discipline
* @property Event $event
* @property RegEventNomination $nomination
* @property RegEventRang $rang
* @property Profile $profile
* @property User $user
* @property RegEventPrice $price
* @property RegEventMusic $music
*/
class RegEvent extends \yii\db\ActiveRecord
{
const STATUS_NOT_PAID = 0;
const STATUS_PAID = 1;
const STATUS_CANCEL = 3;
const VISIT_TRUE = 1;
const VISIT_FALSE = 0;
private $messageUniqueValidator = 'Такая регистрация уже существует!';
public $musicFile;
/**
* {@inheritdoc}
*/
public static function tableName()
{
return 'reg_event';
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
],
];
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['user_id', 'visit'], 'required'],
[['number', 'user_id', 'event_id', 'rang_id', 'discipline_id', 'nomination_id', 'category_id', 'receipt_id', 'status'], 'integer'],
[['created_at', 'updated_at'], 'safe'],
[['created_at'], 'default', 'value' => time()], [['visit'], 'default', 'value' => self::VISIT_FALSE],
[['status'], 'default', 'value' => self::STATUS_NOT_PAID],
[['number'], 'default', 'value' => self::setNumber()],
[['event_id'], 'default', 'value' => self::getEventId()],
[['category_id'], 'required', 'skipOnError' => false, 'when' => function (){
return $this->rang_id || $this->discipline_id || $this->nomination_id;
}],
[['nomination_id'], 'required', 'skipOnError' => false, 'when' => function (){
return $this->rang_id || $this->discipline_id;
}],
[['discipline_id'], 'required', 'skipOnError' => false, 'when' => function (){
return $this->rang_id;
}],
[['category_id'], 'required', 'skipOnError' => false, 'when' => function (){
return !$this->rang_id || !$this->discipline_id || !$this->nomination_id;
}],
[['user_id'], 'unique', 'skipOnEmpty' => false, 'targetAttribute' => ['event_id', 'user_id','rang_id', 'discipline_id', 'nomination_id', 'category_id'], 'message' => $this->messageUniqueValidator],
/*[['user_id'], 'unique', 'targetAttribute' => ['event_id', 'discipline_id', 'nomination_id', 'category_id'], 'message' => $this->messageUniqueValidator, 'when' => function (){
return !$this->rang_id;
}],*/
/*[['user_id'], 'unique', 'targetAttribute' => ['event_id', 'user_id', 'nomination_id', 'category_id'], 'message' => $this->messageUniqueValidator, 'when' => function (){
return !$this->rang_id && !$this->discipline_id;
}],
[['user_id'], 'unique', 'targetAttribute' => ['event_id', 'user_id', 'category_id'], 'message' => $this->messageUniqueValidator, 'when' => function (){
return !$this->rang_id && !$this->discipline_id && !$this->nomination_id;
}],*/
[['receipt_id'], 'exist', 'skipOnError' => true, 'targetClass' => RegEventReceipt::className(), 'targetAttribute' => ['receipt_id' => 'id']],
[['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => RegEventCategory::className(), 'targetAttribute' => ['category_id' => 'id']],
[['discipline_id'], 'exist', 'skipOnError' => true, 'targetClass' => RegEventDiscipline::className(), 'targetAttribute' => ['discipline_id' => 'id']],
[['event_id'], 'exist', 'skipOnError' => true, 'targetClass' => Event::className(), 'targetAttribute' => ['event_id' => 'id']],
[['nomination_id'], 'exist', 'skipOnError' => true, 'targetClass' => RegEventNomination::className(), 'targetAttribute' => ['nomination_id' => 'id']],
[['event_id'], 'exist', 'skipOnError' => true, 'targetClass' => RegEventRang::className(), 'targetAttribute' => ['event_id' => 'id']],
[['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => Profile::className(), 'targetAttribute' => ['user_id' => 'user_id']],
[['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['user_id' => 'id']],
];
}
/**
* {@inheritdoc}
*/
public function attributeLabels()
{
return [
'id' => Registration::t('reg-event', 'ID'),
'number' => Registration::t('reg-event', 'Number'),
'user_id' => Registration::t('reg-event', 'User ID'),
'profile.fullName' => Registration::t('reg-event', 'User ID'),
'event_id' => Registration::t('reg-event', 'Event ID'),
'event.name' => Registration::t('reg-event', 'Event ID'),
'rang_id' => Registration::t('reg-event', 'Rang ID'),
'rang.shortName' => Registration::t('reg-event', 'Rang ID'),
'discipline_id' => Registration::t('reg-event', 'Discipline ID'),
'discipline.shortName' => Registration::t('reg-event', 'Discipline ID'),
'nomination_id' => Registration::t('reg-event', 'Nomination ID'),
'nomination.shortName' => Registration::t('reg-event', 'Nomination ID'),
'category_id' => Registration::t('reg-event', 'Category ID'),
'category.shortName' => Registration::t('reg-event', 'Category ID'),
'receipt_id' => Registration::t('reg-event', 'Receipt ID'),
'status' => Registration::t('reg-event', 'Status'),
'visit' => Registration::t('reg-event', 'Visit'),
'music' => Registration::t('reg-event', 'Music'),
'price' => Registration::t('reg-event', 'Price'),
'price.cost' => Registration::t('reg-event', 'Price'),
'statusName' => Registration::t('reg-event', 'Status'),
'created_at' => Registration::t('reg-event', 'Created At'),
'updated_at' => Registration::t('reg-event', 'Updated At'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getReceipt()
{
return $this->hasOne(RegEventReceipt::className(), ['id' => 'receipt_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getCategory()
{
return $this->hasOne(RegEventCategory::className(), ['id' => 'category_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getDiscipline()
{
return $this->hasOne(RegEventDiscipline::className(), ['id' => 'discipline_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getEvent()
{
return $this->hasOne(Event::className(), ['id' => 'event_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getNomination()
{
return $this->hasOne(RegEventNomination::className(), ['id' => 'nomination_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getRang()
{
return $this->hasOne(RegEventRang::className(), ['id' => 'rang_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getProfile()
{
return $this->hasOne(Profile::className(), ['user_id' => 'user_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getMusic()
{
return $this->hasOne(RegEventMusic::className(), ['number' => 'number']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getPrice()
{
return $this->hasOne(RegEventPrice::className(), ['event_id' => 'event_id'])
->andWhere(['rang_id' => $this->rang_id, 'discipline_id' => $this->discipline_id, 'nomination_id' => $this->nomination_id, ])
->orWhere(['discipline_id' => $this->discipline_id, 'nomination_id' => $this->nomination_id, ]);
}
/**
* {@inheritdoc}
* @return RegEventQuery the active query used by this AR class.
*/
public static function find()
{
return new RegEventQuery(get_called_class());
}
/**
* Статусы для регистрации
* @return array
*/
public static function getStatusList()
{
return [
self::STATUS_NOT_PAID => 'Не оплачено',
self::STATUS_PAID => 'Оплачено',
self::STATUS_CANCEL => 'Отменена'
];
}
/**
* Cтатус регистрации
* @return mixed
*/
public function getStatusName()
{
return ArrayHelper::getValue(self::getStatusList(),$this->status);
}
/**
* Визит для регистрации
* @return array
*/
public static function getVisitList()
{
return [
self::VISIT_TRUE => 'Пришел',
self::VISIT_FALSE => 'Не пришел',
];
}
/**
* Визит регистрации
* @return mixed
*/
public function getVisitName()
{
return ArrayHelper::getValue(self::getVisitList(), $this->visit);
}
/**
* Список цветов для статусов
* @return array
*/
public static function getStatusOptionsList()
{
return [
self::STATUS_NOT_PAID => [
'style' => 'background: #f3d0c9',
'class' => 'danger'
],
self::STATUS_PAID => [
'style' => 'background: #dff0d8',
'class' => 'success'
],
self::STATUS_CANCEL => [
'style' => 'background: #eee; color: #b6b6b6; text-decoration: line-through;',
'class' => 'default'
],
];
}
/**
* @return mixed
*/
public function getStatusOptions()
{
return ArrayHelper::getValue(self::getStatusOptionsList(), $this->status);
}
/**
* Добавить номер
* @return mixed
*/
public static function setNumber()
{
return self::find()->where(['event_id' => self::getEventId()])->max('number') + 1; }
/**
* Получение текущего мероприятия
* @return mixed
*/
public static function getEventId($id = null)
{
return Yii::$app->getModule('registration')->EventSelect->getEventId($id);
}
public function getMusicExists()
{
return $this->music ? true : false ;
}
}
PD9waHAKCm5hbWVzcGFjZSBjb21tb25cbW9kdWxlc1xyZWdpc3RyYXRpb25cbW9kZWxzOwoKdXNlIGJhY2tlbmRcbW9kdWxlc1xldmVudFxtb2RlbHNcRXZlbnQ7CnVzZSBiYWNrZW5kXG1vZHVsZXNccHJvZmlsZVxtb2RlbHNcUHJvZmlsZTsKdXNlIGJhY2tlbmRcbW9kdWxlc1xyZWdpc3RyYXRpb25cbW9kZWxzXHF1ZXJ5XFJlZ0V2ZW50UXVlcnk7CnVzZSBjb21tb25cbW9kZWxzXFVzZXI7CnVzZSBjb21tb25cbW9kdWxlc1xyZWdpc3RyYXRpb25cUmVnaXN0cmF0aW9uOwp1c2UgWWlpOwp1c2UgeWlpXGJlaGF2aW9yc1xUaW1lc3RhbXBCZWhhdmlvcjsKdXNlIHlpaVxoZWxwZXJzXEFycmF5SGVscGVyOwoKLyoqCiAqIFRoaXMgaXMgdGhlIG1vZGVsIGNsYXNzIGZvciB0YWJsZSAicmVnX2V2ZW50Ii4KICoKICogQHByb3BlcnR5IGludCAkaWQKICogQHByb3BlcnR5IGludCAkbnVtYmVyINCd0L7QvNC10YAg0YPRh9Cw0YHRgtC90LjQutCwCiAqIEBwcm9wZXJ0eSBpbnQgJHVzZXJfaWQKICogQHByb3BlcnR5IGludCAkZXZlbnRfaWQKICogQHByb3BlcnR5IGludCAkcmFuZ19pZAogKiBAcHJvcGVydHkgaW50ICRkaXNjaXBsaW5lX2lkCiAqIEBwcm9wZXJ0eSBpbnQgJG5vbWluYXRpb25faWQKICogQHByb3BlcnR5IGludCAkY2F0ZWdvcnlfaWQKICogQHByb3BlcnR5IGludCAkc3RhdHVzINCd0LUg0L7Qv9C70LDRh9C10L3Qviwg0J7Qv9C70LDRh9C10L3Qviwg0J7RgtC80LXQvdC10L3QvgogKiBAcHJvcGVydHkgaW50ICR2aXNpdCDQn9C+0YHQtdGC0LjQuywg0L3QtSDQv9C+0YHQtdGC0LjQuwogKiBAcHJvcGVydHkgaW50ICRjcmVhdGVkX2F0CiAqIEBwcm9wZXJ0eSBpbnQgJHVwZGF0ZWRfYXQKICoKICogQHByb3BlcnR5IFJlZ0V2ZW50Q2F0ZWdvcnkgJGNhdGVnb3J5CiAqIEBwcm9wZXJ0eSBSZWdFdmVudERpc2NpcGxpbmUgJGRpc2NpcGxpbmUKICogQHByb3BlcnR5IEV2ZW50ICRldmVudAogKiBAcHJvcGVydHkgUmVnRXZlbnROb21pbmF0aW9uICRub21pbmF0aW9uCiAqIEBwcm9wZXJ0eSBSZWdFdmVudFJhbmcgJHJhbmcKICogQHByb3BlcnR5IFByb2ZpbGUgJHByb2ZpbGUKICogQHByb3BlcnR5IFVzZXIgJHVzZXIKICogQHByb3BlcnR5IFJlZ0V2ZW50UHJpY2UgJHByaWNlCiAqIEBwcm9wZXJ0eSBSZWdFdmVudE11c2ljICRtdXNpYwogKi8KY2xhc3MgUmVnRXZlbnQgZXh0ZW5kcyBceWlpXGRiXEFjdGl2ZVJlY29yZAp7CgogICAgY29uc3QgU1RBVFVTX05PVF9QQUlEID0gMDsKICAgIGNvbnN0IFNUQVRVU19QQUlEID0gMTsKICAgIGNvbnN0IFNUQVRVU19DQU5DRUwgPSAzOwoKICAgIGNvbnN0IFZJU0lUX1RSVUUgPSAxOwogICAgY29uc3QgVklTSVRfRkFMU0UgPSAwOwoKICAgIHByaXZhdGUgJG1lc3NhZ2VVbmlxdWVWYWxpZGF0b3IgPSAn0KLQsNC60LDRjyDRgNC10LPQuNGB0YLRgNCw0YbQuNGPINGD0LbQtSDRgdGD0YnQtdGB0YLQstGD0LXRgiEnOwoKICAgIHB1YmxpYyAkbXVzaWNGaWxlOwoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRhYmxlTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICdyZWdfZXZlbnQnOwogICAgfQoKICAgIC8qKgogICAgICogQGluaGVyaXRkb2MKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJlaGF2aW9ycygpCiAgICB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJ3RpbWVzdGFtcCcgPT4gWwogICAgICAgICAgICAgICAgJ2NsYXNzJyA9PiBUaW1lc3RhbXBCZWhhdmlvcjo6Y2xhc3NOYW1lKCksCiAgICAgICAgICAgIF0sCiAgICAgICAgXTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJ1bGVzKCkKICAgIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBbWyd1c2VyX2lkJywgJ3Zpc2l0J10sICdyZXF1aXJlZCddLAogICAgICAgICAgICBbWydudW1iZXInLCAndXNlcl9pZCcsICdldmVudF9pZCcsICdyYW5nX2lkJywgJ2Rpc2NpcGxpbmVfaWQnLCAnbm9taW5hdGlvbl9pZCcsICdjYXRlZ29yeV9pZCcsICdyZWNlaXB0X2lkJywgJ3N0YXR1cyddLCAnaW50ZWdlciddLAogICAgICAgICAgICBbWydjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnXSwgJ3NhZmUnXSwKCiAgICAgICAgICAgIFtbJ2NyZWF0ZWRfYXQnXSwgJ2RlZmF1bHQnLCAndmFsdWUnID0+IHRpbWUoKV0sCiAgICAgICAgICAgIFtbJ3Zpc2l0J10sICdkZWZhdWx0JywgJ3ZhbHVlJyA9PiBzZWxmOjpWSVNJVF9GQUxTRV0sCiAgICAgICAgICAgIFtbJ3N0YXR1cyddLCAnZGVmYXVsdCcsICd2YWx1ZScgPT4gc2VsZjo6U1RBVFVTX05PVF9QQUlEXSwKCiAgICAgICAgICAgIFtbJ251bWJlciddLCAnZGVmYXVsdCcsICd2YWx1ZScgPT4gc2VsZjo6c2V0TnVtYmVyKCldLAogICAgICAgICAgICBbWydldmVudF9pZCddLCAnZGVmYXVsdCcsICd2YWx1ZScgPT4gc2VsZjo6Z2V0RXZlbnRJZCgpXSwKCiAgICAgICAgICAgIFtbJ2NhdGVnb3J5X2lkJ10sICdyZXF1aXJlZCcsICdza2lwT25FcnJvcicgPT4gZmFsc2UsICd3aGVuJyA9PiBmdW5jdGlvbiAoKXsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFuZ19pZCB8fCAkdGhpcy0+ZGlzY2lwbGluZV9pZCB8fCAkdGhpcy0+bm9taW5hdGlvbl9pZDsKICAgICAgICAgICAgfV0sCgogICAgICAgICAgICBbWydub21pbmF0aW9uX2lkJ10sICdyZXF1aXJlZCcsICdza2lwT25FcnJvcicgPT4gZmFsc2UsICd3aGVuJyA9PiBmdW5jdGlvbiAoKXsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFuZ19pZCB8fCAkdGhpcy0+ZGlzY2lwbGluZV9pZDsKICAgICAgICAgICAgfV0sCgogICAgICAgICAgICBbWydkaXNjaXBsaW5lX2lkJ10sICdyZXF1aXJlZCcsICdza2lwT25FcnJvcicgPT4gZmFsc2UsICd3aGVuJyA9PiBmdW5jdGlvbiAoKXsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmFuZ19pZDsKICAgICAgICAgICAgfV0sCgogICAgICAgICAgICBbWydjYXRlZ29yeV9pZCddLCAncmVxdWlyZWQnLCAnc2tpcE9uRXJyb3InID0+IGZhbHNlLCAnd2hlbicgPT4gZnVuY3Rpb24gKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gISR0aGlzLT5yYW5nX2lkIHx8ICEkdGhpcy0+ZGlzY2lwbGluZV9pZCB8fCAhJHRoaXMtPm5vbWluYXRpb25faWQ7CiAgICAgICAgICAgIH1dLAoKICAgICAgICAgICAgW1sndXNlcl9pZCddLCAndW5pcXVlJywgICdza2lwT25FbXB0eScgPT4gZmFsc2UsICd0YXJnZXRBdHRyaWJ1dGUnID0+IFsnZXZlbnRfaWQnLCAndXNlcl9pZCcsJ3JhbmdfaWQnLCAnZGlzY2lwbGluZV9pZCcsICdub21pbmF0aW9uX2lkJywgJ2NhdGVnb3J5X2lkJ10sICdtZXNzYWdlJyA9PiAkdGhpcy0+bWVzc2FnZVVuaXF1ZVZhbGlkYXRvcl0sCiAgICAgICAgICAgIC8qW1sndXNlcl9pZCddLCAndW5pcXVlJywgJ3RhcmdldEF0dHJpYnV0ZScgPT4gWydldmVudF9pZCcsICdkaXNjaXBsaW5lX2lkJywgJ25vbWluYXRpb25faWQnLCAnY2F0ZWdvcnlfaWQnXSwgJ21lc3NhZ2UnID0+ICR0aGlzLT5tZXNzYWdlVW5pcXVlVmFsaWRhdG9yLCAnd2hlbicgPT4gZnVuY3Rpb24gKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gISR0aGlzLT5yYW5nX2lkOwogICAgICAgICAgICB9XSwqLwogICAgICAgICAgICAvKltbJ3VzZXJfaWQnXSwgJ3VuaXF1ZScsICd0YXJnZXRBdHRyaWJ1dGUnID0+IFsnZXZlbnRfaWQnLCAndXNlcl9pZCcsICdub21pbmF0aW9uX2lkJywgJ2NhdGVnb3J5X2lkJ10sICdtZXNzYWdlJyA9PiAkdGhpcy0+bWVzc2FnZVVuaXF1ZVZhbGlkYXRvciwgJ3doZW4nID0+IGZ1bmN0aW9uICgpewogICAgICAgICAgICAgICAgcmV0dXJuICEkdGhpcy0+cmFuZ19pZCAmJiAhJHRoaXMtPmRpc2NpcGxpbmVfaWQ7CiAgICAgICAgICAgIH1dLAogICAgICAgICAgICBbWyd1c2VyX2lkJ10sICd1bmlxdWUnLCAndGFyZ2V0QXR0cmlidXRlJyA9PiBbJ2V2ZW50X2lkJywgJ3VzZXJfaWQnLCAnY2F0ZWdvcnlfaWQnXSwgJ21lc3NhZ2UnID0+ICR0aGlzLT5tZXNzYWdlVW5pcXVlVmFsaWRhdG9yLCAnd2hlbicgPT4gZnVuY3Rpb24gKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gISR0aGlzLT5yYW5nX2lkICYmICEkdGhpcy0+ZGlzY2lwbGluZV9pZCAmJiAhJHRoaXMtPm5vbWluYXRpb25faWQ7CiAgICAgICAgICAgIH1dLCovCgogICAgICAgICAgICBbWydyZWNlaXB0X2lkJ10sICdleGlzdCcsICdza2lwT25FcnJvcicgPT4gdHJ1ZSwgJ3RhcmdldENsYXNzJyA9PiBSZWdFdmVudFJlY2VpcHQ6OmNsYXNzTmFtZSgpLCAndGFyZ2V0QXR0cmlidXRlJyA9PiBbJ3JlY2VpcHRfaWQnID0+ICdpZCddXSwKICAgICAgICAgICAgW1snY2F0ZWdvcnlfaWQnXSwgJ2V4aXN0JywgJ3NraXBPbkVycm9yJyA9PiB0cnVlLCAndGFyZ2V0Q2xhc3MnID0+IFJlZ0V2ZW50Q2F0ZWdvcnk6OmNsYXNzTmFtZSgpLCAndGFyZ2V0QXR0cmlidXRlJyA9PiBbJ2NhdGVnb3J5X2lkJyA9PiAnaWQnXV0sCiAgICAgICAgICAgIFtbJ2Rpc2NpcGxpbmVfaWQnXSwgJ2V4aXN0JywgJ3NraXBPbkVycm9yJyA9PiB0cnVlLCAndGFyZ2V0Q2xhc3MnID0+IFJlZ0V2ZW50RGlzY2lwbGluZTo6Y2xhc3NOYW1lKCksICd0YXJnZXRBdHRyaWJ1dGUnID0+IFsnZGlzY2lwbGluZV9pZCcgPT4gJ2lkJ11dLAogICAgICAgICAgICBbWydldmVudF9pZCddLCAnZXhpc3QnLCAnc2tpcE9uRXJyb3InID0+IHRydWUsICd0YXJnZXRDbGFzcycgPT4gRXZlbnQ6OmNsYXNzTmFtZSgpLCAndGFyZ2V0QXR0cmlidXRlJyA9PiBbJ2V2ZW50X2lkJyA9PiAnaWQnXV0sCiAgICAgICAgICAgIFtbJ25vbWluYXRpb25faWQnXSwgJ2V4aXN0JywgJ3NraXBPbkVycm9yJyA9PiB0cnVlLCAndGFyZ2V0Q2xhc3MnID0+IFJlZ0V2ZW50Tm9taW5hdGlvbjo6Y2xhc3NOYW1lKCksICd0YXJnZXRBdHRyaWJ1dGUnID0+IFsnbm9taW5hdGlvbl9pZCcgPT4gJ2lkJ11dLAogICAgICAgICAgICBbWydldmVudF9pZCddLCAnZXhpc3QnLCAnc2tpcE9uRXJyb3InID0+IHRydWUsICd0YXJnZXRDbGFzcycgPT4gUmVnRXZlbnRSYW5nOjpjbGFzc05hbWUoKSwgJ3RhcmdldEF0dHJpYnV0ZScgPT4gWydldmVudF9pZCcgPT4gJ2lkJ11dLAogICAgICAgICAgICBbWyd1c2VyX2lkJ10sICdleGlzdCcsICdza2lwT25FcnJvcicgPT4gdHJ1ZSwgJ3RhcmdldENsYXNzJyA9PiBQcm9maWxlOjpjbGFzc05hbWUoKSwgJ3RhcmdldEF0dHJpYnV0ZScgPT4gWyd1c2VyX2lkJyA9PiAndXNlcl9pZCddXSwKICAgICAgICAgICAgW1sndXNlcl9pZCddLCAnZXhpc3QnLCAnc2tpcE9uRXJyb3InID0+IHRydWUsICd0YXJnZXRDbGFzcycgPT4gVXNlcjo6Y2xhc3NOYW1lKCksICd0YXJnZXRBdHRyaWJ1dGUnID0+IFsndXNlcl9pZCcgPT4gJ2lkJ11dLAogICAgICAgIF07CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhdHRyaWJ1dGVMYWJlbHMoKQogICAgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICdpZCcgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnSUQnKSwKICAgICAgICAgICAgJ251bWJlcicgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnTnVtYmVyJyksCiAgICAgICAgICAgICd1c2VyX2lkJyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdVc2VyIElEJyksCiAgICAgICAgICAgICdwcm9maWxlLmZ1bGxOYW1lJyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdVc2VyIElEJyksCiAgICAgICAgICAgICdldmVudF9pZCcgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnRXZlbnQgSUQnKSwKICAgICAgICAgICAgJ2V2ZW50Lm5hbWUnID0+IFJlZ2lzdHJhdGlvbjo6dCgncmVnLWV2ZW50JywgJ0V2ZW50IElEJyksCiAgICAgICAgICAgICdyYW5nX2lkJyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdSYW5nIElEJyksCiAgICAgICAgICAgICdyYW5nLnNob3J0TmFtZScgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnUmFuZyBJRCcpLAogICAgICAgICAgICAnZGlzY2lwbGluZV9pZCcgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnRGlzY2lwbGluZSBJRCcpLAogICAgICAgICAgICAnZGlzY2lwbGluZS5zaG9ydE5hbWUnID0+IFJlZ2lzdHJhdGlvbjo6dCgncmVnLWV2ZW50JywgJ0Rpc2NpcGxpbmUgSUQnKSwKICAgICAgICAgICAgJ25vbWluYXRpb25faWQnID0+IFJlZ2lzdHJhdGlvbjo6dCgncmVnLWV2ZW50JywgJ05vbWluYXRpb24gSUQnKSwKICAgICAgICAgICAgJ25vbWluYXRpb24uc2hvcnROYW1lJyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdOb21pbmF0aW9uIElEJyksCiAgICAgICAgICAgICdjYXRlZ29yeV9pZCcgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnQ2F0ZWdvcnkgSUQnKSwKICAgICAgICAgICAgJ2NhdGVnb3J5LnNob3J0TmFtZScgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnQ2F0ZWdvcnkgSUQnKSwKICAgICAgICAgICAgJ3JlY2VpcHRfaWQnID0+IFJlZ2lzdHJhdGlvbjo6dCgncmVnLWV2ZW50JywgJ1JlY2VpcHQgSUQnKSwKICAgICAgICAgICAgJ3N0YXR1cycgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnU3RhdHVzJyksCiAgICAgICAgICAgICd2aXNpdCcgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnVmlzaXQnKSwKICAgICAgICAgICAgJ211c2ljJyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdNdXNpYycpLAogICAgICAgICAgICAncHJpY2UnID0+IFJlZ2lzdHJhdGlvbjo6dCgncmVnLWV2ZW50JywgJ1ByaWNlJyksCiAgICAgICAgICAgICdwcmljZS5jb3N0JyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdQcmljZScpLAogICAgICAgICAgICAnc3RhdHVzTmFtZScgPT4gUmVnaXN0cmF0aW9uOjp0KCdyZWctZXZlbnQnLCAnU3RhdHVzJyksCiAgICAgICAgICAgICdjcmVhdGVkX2F0JyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdDcmVhdGVkIEF0JyksCiAgICAgICAgICAgICd1cGRhdGVkX2F0JyA9PiBSZWdpc3RyYXRpb246OnQoJ3JlZy1ldmVudCcsICdVcGRhdGVkIEF0JyksCiAgICAgICAgXTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gXHlpaVxkYlxBY3RpdmVRdWVyeQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVjZWlwdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5oYXNPbmUoUmVnRXZlbnRSZWNlaXB0OjpjbGFzc05hbWUoKSwgWydpZCcgPT4gJ3JlY2VpcHRfaWQnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFx5aWlcZGJcQWN0aXZlUXVlcnkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENhdGVnb3J5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhhc09uZShSZWdFdmVudENhdGVnb3J5OjpjbGFzc05hbWUoKSwgWydpZCcgPT4gJ2NhdGVnb3J5X2lkJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBceWlpXGRiXEFjdGl2ZVF1ZXJ5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREaXNjaXBsaW5lKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhhc09uZShSZWdFdmVudERpc2NpcGxpbmU6OmNsYXNzTmFtZSgpLCBbJ2lkJyA9PiAnZGlzY2lwbGluZV9pZCddKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gXHlpaVxkYlxBY3RpdmVRdWVyeQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXZlbnQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGFzT25lKEV2ZW50OjpjbGFzc05hbWUoKSwgWydpZCcgPT4gJ2V2ZW50X2lkJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBceWlpXGRiXEFjdGl2ZVF1ZXJ5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROb21pbmF0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhhc09uZShSZWdFdmVudE5vbWluYXRpb246OmNsYXNzTmFtZSgpLCBbJ2lkJyA9PiAnbm9taW5hdGlvbl9pZCddKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gXHlpaVxkYlxBY3RpdmVRdWVyeQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmFuZygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5oYXNPbmUoUmVnRXZlbnRSYW5nOjpjbGFzc05hbWUoKSwgWydpZCcgPT4gJ3JhbmdfaWQnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFx5aWlcZGJcQWN0aXZlUXVlcnkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByb2ZpbGUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGFzT25lKFByb2ZpbGU6OmNsYXNzTmFtZSgpLCBbJ3VzZXJfaWQnID0+ICd1c2VyX2lkJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBceWlpXGRiXEFjdGl2ZVF1ZXJ5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNdXNpYygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5oYXNPbmUoUmVnRXZlbnRNdXNpYzo6Y2xhc3NOYW1lKCksIFsnbnVtYmVyJyA9PiAnbnVtYmVyJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBceWlpXGRiXEFjdGl2ZVF1ZXJ5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVc2VyKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhhc09uZShVc2VyOjpjbGFzc05hbWUoKSwgWydpZCcgPT4gJ3VzZXJfaWQnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFx5aWlcZGJcQWN0aXZlUXVlcnkKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByaWNlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhhc09uZShSZWdFdmVudFByaWNlOjpjbGFzc05hbWUoKSwgWydldmVudF9pZCcgPT4gJ2V2ZW50X2lkJ10pCiAgICAgICAgICAgIC0+YW5kV2hlcmUoWydyYW5nX2lkJyA9PiAkdGhpcy0+cmFuZ19pZCwgJ2Rpc2NpcGxpbmVfaWQnID0+ICR0aGlzLT5kaXNjaXBsaW5lX2lkLCAnbm9taW5hdGlvbl9pZCcgPT4gJHRoaXMtPm5vbWluYXRpb25faWQsIF0pCiAgICAgICAgICAgIC0+b3JXaGVyZShbJ2Rpc2NpcGxpbmVfaWQnID0+ICR0aGlzLT5kaXNjaXBsaW5lX2lkLCAnbm9taW5hdGlvbl9pZCcgPT4gJHRoaXMtPm5vbWluYXRpb25faWQsIF0pOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICogQHJldHVybiBSZWdFdmVudFF1ZXJ5IHRoZSBhY3RpdmUgcXVlcnkgdXNlZCBieSB0aGlzIEFSIGNsYXNzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmQoKQogICAgewogICAgICAgIHJldHVybiBuZXcgUmVnRXZlbnRRdWVyeShnZXRfY2FsbGVkX2NsYXNzKCkpOwogICAgfQoKICAgIC8qKgogICAgICog0KHRgtCw0YLRg9GB0Ysg0LTQu9GPINGA0LXQs9C40YHRgtGA0LDRhtC40LgKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdGF0dXNMaXN0KCkKICAgIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBzZWxmOjpTVEFUVVNfTk9UX1BBSUQgPT4gJ9Cd0LUg0L7Qv9C70LDRh9C10L3QvicsCiAgICAgICAgICAgIHNlbGY6OlNUQVRVU19QQUlEID0+ICfQntC/0LvQsNGH0LXQvdC+JywKICAgICAgICAgICAgc2VsZjo6U1RBVFVTX0NBTkNFTCA9PiAn0J7RgtC80LXQvdC10L3QsCcKICAgICAgICBdOwogICAgfQoKICAgIC8qKgogICAgICogQ9GC0LDRgtGD0YEg0YDQtdCz0LjRgdGC0YDQsNGG0LjQuAogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyOjpnZXRWYWx1ZShzZWxmOjpnZXRTdGF0dXNMaXN0KCksJHRoaXMtPnN0YXR1cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiDQktC40LfQuNGCINC00LvRjyDRgNC10LPQuNGB0YLRgNCw0YbQuNC4CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmlzaXRMaXN0KCkKICAgIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBzZWxmOjpWSVNJVF9UUlVFID0+ICfQn9GA0LjRiNC10LsnLAogICAgICAgICAgICBzZWxmOjpWSVNJVF9GQUxTRSA9PiAn0J3QtSDQv9GA0LjRiNC10LsnLAogICAgICAgIF07CiAgICB9CgogICAgLyoqCiAgICAgKiDQktC40LfQuNGCINGA0LXQs9C40YHRgtGA0LDRhtC40LgKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZpc2l0TmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyOjpnZXRWYWx1ZShzZWxmOjpnZXRWaXNpdExpc3QoKSwgJHRoaXMtPnZpc2l0KTsKICAgIH0KCiAgICAvKioKICAgICAqINCh0L/QuNGB0L7QuiDRhtCy0LXRgtC+0LIg0LTQu9GPINGB0YLQsNGC0YPRgdC+0LIKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdGF0dXNPcHRpb25zTGlzdCgpCiAgICB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgc2VsZjo6U1RBVFVTX05PVF9QQUlEID0+IFsKICAgICAgICAgICAgICAgICdzdHlsZScgPT4gJ2JhY2tncm91bmQ6ICNmM2QwYzknLAogICAgICAgICAgICAgICAgJ2NsYXNzJyA9PiAnZGFuZ2VyJwogICAgICAgICAgICBdLAogICAgICAgICAgICBzZWxmOjpTVEFUVVNfUEFJRCA9PiBbCiAgICAgICAgICAgICAgICAnc3R5bGUnID0+ICdiYWNrZ3JvdW5kOiAjZGZmMGQ4JywKICAgICAgICAgICAgICAgICdjbGFzcycgPT4gJ3N1Y2Nlc3MnCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHNlbGY6OlNUQVRVU19DQU5DRUwgPT4gWwogICAgICAgICAgICAgICAgJ3N0eWxlJyA9PiAnYmFja2dyb3VuZDogI2VlZTsgY29sb3I6ICNiNmI2YjY7IHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOycsCiAgICAgICAgICAgICAgICAnY2xhc3MnID0+ICdkZWZhdWx0JwogICAgICAgICAgICBdLAogICAgICAgIF07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNPcHRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gQXJyYXlIZWxwZXI6OmdldFZhbHVlKHNlbGY6OmdldFN0YXR1c09wdGlvbnNMaXN0KCksICR0aGlzLT5zdGF0dXMpOwogICAgfQoKICAgIC8qKgogICAgICog0JTQvtCx0LDQstC40YLRjCDQvdC+0LzQtdGACiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0TnVtYmVyKCkKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6ZmluZCgpLT53aGVyZShbJ2V2ZW50X2lkJyA9PiBzZWxmOjpnZXRFdmVudElkKCldKS0+bWF4KCdudW1iZXInKSArIDE7CiAgICB9CgogICAgLyoqCiAgICAgKiDQn9C+0LvRg9GH0LXQvdC40LUg0YLQtdC60YPRidC10LPQviDQvNC10YDQvtC/0YDQuNGP0YLQuNGPCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXZlbnRJZCgkaWQgPSBudWxsKQogICAgewogICAgICAgIHJldHVybiBZaWk6OiRhcHAtPmdldE1vZHVsZSgncmVnaXN0cmF0aW9uJyktPkV2ZW50U2VsZWN0LT5nZXRFdmVudElkKCRpZCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE11c2ljRXhpc3RzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm11c2ljID8gdHJ1ZSA6IGZhbHNlIDsKICAgIH0KCn0K