浏览代码

Behavioral Cloning & Trainers Reorg (#328)

* Implement behavioral cloning for cc/dc, fc/rnn, state/observations.
* Re-organize folder structure in anticipation of unitytrainers as a package.
* Create demo environment BananaImitation to validate behavioral cloning.
* Fixes #336
/develop-generalizationTraining-TrainerController
GitHub 7 年前
当前提交
8317a659
共有 51 个文件被更改,包括 7904 次插入2037 次删除
  1. 5
      python/learn.py
  2. 4
      python/test_unityagents.py
  3. 31
      python/trainer_config.yaml
  4. 5
      python/unityagents/environment.py
  5. 758
      unity-environment/Assets/ML-Agents/Examples/3DBall/3DScene.unity
  6. 2
      unity-environment/Assets/ML-Agents/Examples/Area/Materials/wall.mat
  7. 6
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/ground.mat
  8. 8
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/BAD BANANA.prefab
  9. 4
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/BANANA.prefab
  10. 33
      unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaAcademy.cs
  11. 116
      unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaAgent.cs
  12. 33
      unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaArea.cs
  13. 11
      unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaLogic.cs
  14. 2
      unity-environment/Assets/ML-Agents/Scripts/Academy.cs
  15. 12
      unity-environment/Assets/ML-Agents/Scripts/Monitor.cs
  16. 12
      python/unitytrainers/ppo/ppo_trainer.py
  17. 2
      python/unitytrainers/trainer.py
  18. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/BananaImitation.unity
  19. 9
      unity-environment/Assets/ML-Agents/Examples/Banana/BananaImitation.unity.meta
  20. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/BananaRL.unity
  21. 76
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_happy.mat
  22. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_happy.mat.meta
  23. 76
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_sad.mat
  24. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_sad.mat.meta
  25. 76
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/badColor.mat
  26. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Materials/badColor.mat.meta
  27. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgent.prefab
  28. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgent.prefab.meta
  29. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgentVisual.prefab
  30. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgentVisual.prefab.meta
  31. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgent.prefab
  32. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgent.prefab.meta
  33. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgentVisual.prefab
  34. 10
      unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgentVisual.prefab.meta
  35. 450
      unity-environment/Assets/ML-Agents/Examples/Banana/TFModels/BananaI.bytes
  36. 9
      unity-environment/Assets/ML-Agents/Examples/Banana/TFModels/BananaI.bytes.meta
  37. 37
      python/unitytrainers/bc/bc_models.py
  38. 298
      python/unitytrainers/bc/bc_trainer.py
  39. 234
      python/unitytrainers/models.py
  40. 73
      python/unitytrainers/ppo/ppo_models.py
  41. 234
      python/unitytrainers/trainer_controller.py
  42. 248
      python/trainer_controller.py
  43. 1001
      unity-environment/Assets/ML-Agents/Examples/Banana/Banana.unity
  44. 0
      /unity-environment/Assets/ML-Agents/Examples/Banana/BananaRL.unity.meta
  45. 0
      /python/unitytrainers/buffer.py
  46. 0
      /python/unitytrainers/ppo/ppo_trainer.py
  47. 0
      /python/unitytrainers/trainer.py

5
python/learn.py


# ## ML-Agent Learning
import logging
from trainer_controller import TrainerController
from unitytrainers.trainer_controller import TrainerController
if __name__ == '__main__':
logger = logging.getLogger("unityagents")

--load Whether to load the model or randomly initialize [default: False].
--run-id=<path> The sub-directory name for model and summary statistics [default: ppo].
--save-freq=<n> Frequency at which to save model [default: 50000].
--seed=<n> Random seed used for training [default: None].
--seed=<n> Random seed used for training [default: -1].
--slow Whether to run the game at training speed [default: False].
--train Whether to train model, or only run inference [default: False].
--worker-id=<n> Number to add to communication port (5005). Used for multi-environment [default: 0].

4
python/test_unityagents.py


import pytest
import struct
from trainers.buffer import Buffer
from trainers.ppo_models import *
from unitytrainers.buffer import Buffer
from unitytrainers.models import *
from unityagents import UnityEnvironment, UnityEnvironmentException, UnityActionException, \
BrainInfo, Curriculum

31
python/trainer_config.yaml


default:
trainer: ppo
batch_size: 32
beta: 5.0e-3
buffer_size: 512

summary_freq: 2000
time_horizon: 5
TurretBrain: ExampleBrain
ghost-HunterBrain:
brain_to_copy : HunterBrain
is_ghost : true
new_model_freq : 10000
max_num_models : 20
ghost-HunteeBrain :
brain_to_copy : HunteeBrain
is_ghost : true
new_model_freq : 10000
max_num_models : 20
ghost-Ball3DBrain:
brain_to_copy : Ball3DBrain
is_ghost : true
new_model_freq : 10000
max_num_models : 3
Player:
# is_imitation : true
StudentBrain:
trainer: imitation
brain_to_imitate: ExpertBrain
batch_size: 16
batches_per_epoch: 10
num_layers: 4
hidden_units: 64
use_recurrent: false
sequence_length: 16
buffer_size: 128

5
python/unityagents/environment.py


class UnityEnvironment(object):
def __init__(self, file_name, worker_id=0,
base_port=5005, curriculum=None,
seed=None):
seed=0):
"""
Starts a new unity environment and establishes a connection with the environment.
Notice: Currently communication between Unity and Python takes place over an open socket without authentication.

:int base_port: Baseline port number to connect to Unity environment over. worker_id increments over this.
:int worker_id: Number to add to communication port (5005) [0]. Used for asynchronous agent scenarios.
"""
if seed is None:
seed = datetime.now()
atexit.register(self.close)
self.port = base_port + worker_id
self._buffer_size = 12000

758
unity-environment/Assets/ML-Agents/Examples/3DBall/3DScene.unity


--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 8
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3

m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0.3731316, g: 0.38074902, b: 0.3587254, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0

m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 1
m_LightmapEditorSettings:
serializedVersion: 9
serializedVersion: 10
m_TextureWidth: 1024
m_TextureHeight: 1024
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1

debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!114 &83817756
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 41e9bda8f3cf1492fa74926a530f6f70, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
broadcast: 1
continuousPlayerActions:
- key: 276
index: 0
value: 1
- key: 275
index: 0
value: -1
- key: 273
index: 1
value: 1
- key: 274
index: 1
value: -1
discretePlayerActions: []
defaultAction: -1
brain: {fileID: 667765197}
--- !u!1001 &119733639
Prefab:
m_ObjectHideFlags: 0

m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &270885326
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -3.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 23.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 23
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game22 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &292233615
Prefab:
m_ObjectHideFlags: 0

m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RenderingLayerMask: 4294967295
m_Materials:
- {fileID: 2100000, guid: e5a827147332b4e80b0586e4b0df358f, type: 2}
m_StaticBatchInfo:

m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &594888980
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -3.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 29.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 18
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game12 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!114 &667765197
MonoBehaviour:
m_ObjectHideFlags: 0

stateSpaceType: 1
brainType: 2
CoreBrains:
- {fileID: 762385129}
- {fileID: 1015708291}
- {fileID: 729645703}
- {fileID: 1012300078}
instanceID: 13708
--- !u!1001 &725293479
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -10.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 23.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 21
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game21 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &728628169
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -3.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 17.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 26
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game32 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!114 &729645703
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 35813a1be64e144f887d7d5f15b963fa, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
brain: {fileID: 667765197}
--- !u!114 &762385129
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 41e9bda8f3cf1492fa74926a530f6f70, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
broadcast: 1
continuousPlayerActions:
- key: 276
index: 0
value: 1
- key: 275
index: 0
value: -1
- key: 273
index: 1
value: 1
- key: 274
index: 1
value: -1
discretePlayerActions: []
defaultAction: -1
brain: {fileID: 667765197}
- {fileID: 83817756}
- {fileID: 1068402606}
- {fileID: 1502890040}
- {fileID: 2016945725}
instanceID: 13876
--- !u!1001 &764818074
Prefab:
m_ObjectHideFlags: 0

m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!114 &1012300078
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8b23992c8eb17439887f5e944bf04a40, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
broadcast: 1
graphModel: {fileID: 4900000, guid: e91b53b17600f4c23a270f97bad1e60d, type: 3}
graphScope:
graphPlaceholders: []
BatchSizePlaceholderName: batch_size
StatePlacholderName: state
RecurrentInPlaceholderName: recurrent_in
RecurrentOutPlaceholderName: recurrent_out
ObservationPlaceholderName: []
ActionPlaceholderName: action
brain: {fileID: 667765197}
--- !u!114 &1015708291
--- !u!114 &1068402606
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}

m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 943466ab374444748a364f9d6c3e2fe2, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
broadcast: 1
brain: {fileID: 667765197}

m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1357945596
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -10.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 29.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 17
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game11 (1)
objectReference: {fileID: 0}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1390784107
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: -10.3
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 17.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 25
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game31 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1 &1397918840
GameObject:
m_ObjectHideFlags: 0

m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 14.45, y: 0, z: 0}
--- !u!1001 &1414689712
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 3.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 23.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 22
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game23 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1450507641
Prefab:
m_ObjectHideFlags: 0

m_Father: {fileID: 1583402088}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1502890040
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 35813a1be64e144f887d7d5f15b963fa, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
brain: {fileID: 667765197}
--- !u!1 &1583402087
GameObject:
m_ObjectHideFlags: 0

targetFrameRate: -1
defaultResetParameters: []
done: 0
maxStepReached: 0
--- !u!1001 &1609390330
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 10.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 29.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 20
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game14 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1662052408
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 3.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 17.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 27
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game33 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1685940696
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 3.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 29.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 19
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game13 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1 &1746325439
GameObject:
m_ObjectHideFlags: 0

m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
--- !u!1001 &1955599948
Prefab:
--- !u!114 &2016945725
MonoBehaviour:
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 10.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 23.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 24
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game24 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8b23992c8eb17439887f5e944bf04a40, type: 3}
m_Name: (Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)(Clone)
m_EditorClassIdentifier:
broadcast: 1
graphModel: {fileID: 4900000, guid: e91b53b17600f4c23a270f97bad1e60d, type: 3}
graphScope:
graphPlaceholders: []
BatchSizePlaceholderName: batch_size
StatePlacholderName: state
RecurrentInPlaceholderName: recurrent_in
RecurrentOutPlaceholderName: recurrent_out
ObservationPlaceholderName: []
ActionPlaceholderName: action
brain: {fileID: 667765197}
--- !u!1 &2063801192
GameObject:
m_ObjectHideFlags: 0

m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 34.15, y: 0, z: 0}
--- !u!1001 &2145067274
Prefab:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.x
value: 10.7
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.y
value: 17.41
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalPosition.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4162486845013972, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_RootOrder
value: 28
objectReference: {fileID: 0}
- target: {fileID: 1665577603478558, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
propertyPath: m_Name
value: Game34 (1)
objectReference: {fileID: 0}
- target: {fileID: 114980646877373948, guid: ff026d63a00abdc48ad6ddcff89aba04,
type: 2}
propertyPath: brain
value:
objectReference: {fileID: 667765197}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: ff026d63a00abdc48ad6ddcff89aba04, type: 2}
m_IsPrefabParent: 0

2
unity-environment/Assets/ML-Agents/Examples/Area/Materials/wall.mat


- _UVSec: 0
- _ZWrite: 0
m_Colors:
- _Color: {r: 0.44705883, g: 0.4509804, b: 0.4627451, a: 0.78431374}
- _Color: {r: 0.58682954, g: 0.58901924, b: 0.5955882, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

6
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/ground.mat


- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0
- _Glossiness: 0.2
- _Metallic: 0
- _Metallic: 0.2
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02

- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.33540985, g: 0.36590165, b: 0.372, a: 1}
- _Color: {r: 0.31255403, g: 0.3400825, b: 0.3455882, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

8
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/BAD BANANA.prefab


m_PrefabInternal: {fileID: 100100000}
m_GameObject: {fileID: 1724820272436810}
m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalPosition: {x: -0, y: 1.46, z: 0}
m_LocalScale: {x: 72.52302, y: 72.39879, z: 72.52292}
m_Children: []
m_Father: {fileID: 0}

m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_Materials:
- {fileID: 2100000, guid: 88b9ae7af2c1748a0a1f63407587a601, type: 2}
- {fileID: 2100000, guid: 2a6df5f4bffbc431bacfbd2c155375cb, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0

m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 0.02, y: 0.02, z: 0.04}
m_Center: {x: 0.004, y: -0.0000000074447537, z: 0.0004914426}
m_Size: {x: 0.015, y: 0.015, z: 0.04}
m_Center: {x: 0.002, y: 0, z: 0}
--- !u!114 &114713238261374398
MonoBehaviour:
m_ObjectHideFlags: 1

4
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/BANANA.prefab


m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 0.02, y: 0.02, z: 0.04}
m_Center: {x: 0.004, y: -0.0000000074447537, z: 0.0004914426}
m_Size: {x: 0.015, y: 0.015, z: 0.04}
m_Center: {x: 0.002, y: 0, z: 0}
--- !u!114 &114475702868436998
MonoBehaviour:
m_ObjectHideFlags: 1

33
unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaAcademy.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BananaAcademy : Academy {
public class BananaAcademy : Academy
{
[HideInInspector]
[HideInInspector]
public override void AcademyReset()
{
public int totalScore;
public Text scoreText;
public override void AcademyReset()
{
agents = GameObject.FindGameObjectsWithTag("agent");
foreach ( BananaArea ba in listArea){
agents = GameObject.FindGameObjectsWithTag("agent");
foreach (BananaArea ba in listArea)
{
}
totalScore = 0;
}
void ClearObjects(GameObject[] objects) {
void ClearObjects(GameObject[] objects)
{
foreach (GameObject bana in objects)
{
Destroy(bana);

public override void AcademyStep()
{
}
public override void AcademyStep()
{
scoreText.text = string.Format(@"Score: {0}", totalScore);
}
}

116
unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaAgent.cs


public class BananaAgent : Agent
{
public GameObject myAcademyObj;
BananaAcademy myAcademy;
BananaArea myArea;
bool poisioned;
bool satiated;
float effectTime;
Rigidbody agentRB;
public float turnSpeed;
public float xForce;

public Material badMaterial;
public Material goodMaterial;
public bool contribute;
public override void InitializeAgent()
{

myArea = area.GetComponent<BananaArea>();
myAcademy = myAcademyObj.GetComponent<BananaAcademy>();
}
public override List<float> CollectState()

return state;
}
public List<float> RayPerception(List<float> state, float rayDistance, float[] rayAngles, string[] detectableObjects) {
public List<float> RayPerception(List<float> state, float rayDistance,
float[] rayAngles, string[] detectableObjects)
{
foreach (float angle in rayAngles)
{
float noise = 0f;

return new Vector3(x, -0.1f, z);
}
public float DegreeToRadian(float degree){
public float DegreeToRadian(float degree)
{
return degree * Mathf.PI / 180f;
}

return new Color32(R, G, B, 255);
}
public void Unfreeze() {
frozen = false;
gameObject.tag = "agent";
gameObject.GetComponent<Renderer>().material = normalMaterial;
}
Monitor.Log("Bananas", bananas, MonitorType.text, gameObject.transform);
if (Time.time > frozenTime + 4f) {
if (Time.time > frozenTime + 4f && frozen)
{
if (Time.time > effectTime + 0.5f)
{
if (poisioned)
{
Unpoison();
}
if (satiated)
{
Unsatiate();
}
}
Vector3 dirToGo = Vector3.zero;
Vector3 rotateDir = Vector3.zero;

dirToGo = transform.forward * Mathf.Clamp(act[0], -1f, 1f);
rotateDir = transform.up * Mathf.Clamp(act[1], -1f, 1f);
if (Mathf.Clamp(act[2], 0f, 1f) > 0.5f) {
if (Mathf.Clamp(act[2], 0f, 1f) > 0.5f)
{
agentRB.velocity *= 0.75f;
agentRB.AddForce(new Vector3(dirToGo.x * xForce, dirToGo.y * yForce, dirToGo.z * zForce), ForceMode.Acceleration);
agentRB.AddForce(new Vector3(dirToGo.x * xForce, dirToGo.y * yForce, dirToGo.z * zForce),
ForceMode.Acceleration);
}
if (agentRB.velocity.sqrMagnitude > 25f) //slow it down

if (shoot) {
if (shoot)
{
Vector3 position = transform.TransformDirection(GiveCatersian(25f, 90f));
Debug.DrawRay(transform.position, position, Color.red, 0f, true);
RaycastHit hit;

}
}
}
else {
else
{
myLazer.transform.localScale = new Vector3(0f, 0f, 0f);
}

public void Freeze() {
void Freeze()
{
gameObject.tag = "frozenAgent";
frozen = true;
frozenTime = Time.time;

void Unfreeze()
{
frozen = false;
gameObject.tag = "agent";
gameObject.GetComponent<Renderer>().material = normalMaterial;
}
void Poison()
{
poisioned = true;
effectTime = Time.time;
gameObject.GetComponent<Renderer>().material = badMaterial;
}
void Unpoison()
{
poisioned = false;
gameObject.GetComponent<Renderer>().material = normalMaterial;
}
void Satiate()
{
satiated = true;
effectTime = Time.time;
gameObject.GetComponent<Renderer>().material = goodMaterial;
}
void Unsatiate()
{
satiated = false;
gameObject.GetComponent<Renderer>().material = normalMaterial;
}
public override void AgentStep(float[] act)
{
MoveAgent(act);

{
Unfreeze();
Unpoison();
Unsatiate();
transform.position = new Vector3(Random.Range(-myArea.range, myArea.range),
2f, Random.Range(-myArea.range, myArea.range))
+ area.transform.position;
transform.rotation = Quaternion.Euler(new Vector3(0f, Random.Range(0, 360)));
private void OnCollisionEnter(Collision collision)
void OnCollisionEnter(Collision collision)
Satiate();
if (contribute)
{
myAcademy.totalScore += 1;
}
Poison();
if (contribute)
{
myAcademy.totalScore -= 1;
}
}
if (collision.gameObject.CompareTag("wall"))
{
done = true;
public override void AgentOnDone()
{

33
unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaArea.cs


public int numBananas;
public int numBadBananas;
public bool respawnBananas;
public float range;
// Use this for initialization
void Start()
{

}
void CreateBanana(int numBana, GameObject bananaType)
{
for (int i = 0; i < numBana; i++)
{
GameObject bana = Instantiate(bananaType, new Vector3(Random.Range(-range, range), 1f,
Random.Range(-range, range)) + transform.position,
Quaternion.Euler(new Vector3(0f, Random.Range(0f, 360f), 90f)));
bana.GetComponent<BananaLogic>().respawn = respawnBananas;
bana.GetComponent<BananaLogic>().myArea = this;
}
}
float range = 45f;
agent.transform.position = new Vector3(Random.Range(-range, range), 2f, Random.Range(-range, range)) + transform.position;
agent.transform.position = new Vector3(Random.Range(-range, range), 2f,
Random.Range(-range, range))
+ transform.position;
for (int i = 0; i < numBananas; i++)
{
GameObject bana = Instantiate(banana, new Vector3(Random.Range(-range, range), 1f, Random.Range(-range, range)) + transform.position, banana.gameObject.transform.rotation);
bana.GetComponent<BananaLogic>().respawn = respawnBananas;
}
for (int i = 0; i < numBadBananas; i++)
{
GameObject bana = Instantiate(badBanana, new Vector3(Random.Range(-range, range), 1f, Random.Range(-range, range)) + transform.position, banana.gameObject.transform.rotation);
bana.GetComponent<BananaLogic>().respawn = respawnBananas;
}
CreateBanana(numBananas, banana);
CreateBanana(numBadBananas, badBanana);
}

11
unity-environment/Assets/ML-Agents/Examples/Banana/Scripts/BananaLogic.cs


public class BananaLogic : MonoBehaviour {
public bool respawn;
public BananaArea myArea;
// Use this for initialization
void Start () {

}
public void OnEaten() {
if (respawn) {
transform.position = new Vector3(Random.Range(-45f, 45f), transform.position.y + 3f, Random.Range(-45f, 45f));
if (respawn)
{
transform.position = new Vector3(Random.Range(-myArea.range, myArea.range),
transform.position.y + 3f,
Random.Range(-myArea.range, myArea.range));
else {
else
{
Destroy(gameObject);
}
}

2
unity-environment/Assets/ML-Agents/Scripts/Academy.cs


QualitySettings.SetQualityLevel(inferenceConfiguration.qualityLevel, true);
Time.timeScale = inferenceConfiguration.timeScale;
Application.targetFrameRate = inferenceConfiguration.targetFrameRate;
Monitor.SetActive(true);
}
}

if (brain != null && child.gameObject.activeSelf)
brains.Add(brain);
}
}
}

12
unity-environment/Assets/ML-Agents/Scripts/Monitor.cs


MonitorType displayType = MonitorType.text,
Transform target = null)
{
if (!isInstanciated)
{
InstanciateCanvas();

canvas.AddComponent<Monitor>();
}
displayTransformValues = new Dictionary<Transform, Dictionary< string , DisplayValue>>();
private float[] ToFloatArray(object input)
float[] ToFloatArray(object input)
{
try
{

catch
{
}
try
{

}
catch
{
}
return new float[0];

}
}
private void Initialize()
void Initialize()
keyStyle = GUI.skin.label;
valueStyle = GUI.skin.label;
valueStyle.clipping = TextClipping.Overflow;

greenStyle = colorStyle[3];
redStyle = colorStyle[5];
}
}

12
python/unitytrainers/ppo/ppo_trainer.py


import numpy as np
import tensorflow as tf
from trainers.buffer import Buffer
from trainers.ppo_models import create_agent_model
from trainers.trainer import UnityTrainerException, Trainer
from unitytrainers.buffer import Buffer
from unitytrainers.ppo.ppo_models import PPOModel
from unitytrainers.trainer import UnityTrainerException, Trainer
logger = logging.getLogger("unityagents")

self.variable_scope = trainer_parameters['graph_scope']
with tf.variable_scope(self.variable_scope):
tf.set_random_seed(seed)
self.model = create_agent_model(env.brains[brain_name],
self.model = PPOModel(env.brains[brain_name],
lr=float(trainer_parameters['learning_rate']),
h_size=int(trainer_parameters['hidden_units']),
epsilon=float(trainer_parameters['epsilon']),

self.model.returns_holder: np.array(_buffer['discounted_returns'][start:end]).reshape(
[-1]),
self.model.advantage: np.array(_buffer['advantages'][start:end]).reshape([-1, 1]),
self.model.old_probs: np.array(
self.model.all_old_probs: np.array(
_buffer['action_probs'][start:end]).reshape([-1, self.brain.action_space_size])}
if self.is_continuous:
feed_dict[self.model.epsilon] = np.array(

[-1, self.brain.state_space_size * self.brain.stacked_states])
else:
feed_dict[self.model.state_in] = np.array(
_buffer['states'][start:end]).reshape([-1, 1])
_buffer['states'][start:end]).reshape([-1, self.brain.stacked_states])
if self.use_observations:
for i, _ in enumerate(self.model.observation_in):
_obs = np.array(_buffer['observations%d' % i][start:end])

2
python/unitytrainers/trainer.py


class Trainer(object):
"""This class is the abstract class for the trainers"""
"""This class is the abstract class for the unitytrainers"""
def __init__(self, sess, env, brain_name, trainer_parameters, training):
"""

1001
unity-environment/Assets/ML-Agents/Examples/Banana/BananaImitation.unity
文件差异内容过多而无法显示
查看文件

9
unity-environment/Assets/ML-Agents/Examples/Banana/BananaImitation.unity.meta


fileFormatVersion: 2
guid: 3ae10073cde7641f488ef7c87862333a
timeCreated: 1517881609
licenseType: Pro
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

1001
unity-environment/Assets/ML-Agents/Examples/Banana/BananaRL.unity
文件差异内容过多而无法显示
查看文件

76
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_happy.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: agent_happy
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.2640571, g: 0.8161765, b: 0.47348183, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

10
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_happy.mat.meta


fileFormatVersion: 2
guid: 8172bbc45544341beb1c63c52c91c3b7
timeCreated: 1517970222
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

76
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_sad.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: agent_sad
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.75735295, g: 0.1726319, b: 0.1726319, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

10
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/agent_sad.mat.meta


fileFormatVersion: 2
guid: baad74f40a7944620a17e25311910b34
timeCreated: 1517970222
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

76
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/badColor.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: badColor
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.17850657, g: 0.15835857, b: 0.74264705, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

10
unity-environment/Assets/ML-Agents/Examples/Banana/Materials/badColor.mat.meta


fileFormatVersion: 2
guid: 2a6df5f4bffbc431bacfbd2c155375cb
timeCreated: 1518141337
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

1001
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgent.prefab
文件差异内容过多而无法显示
查看文件

10
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgent.prefab.meta


fileFormatVersion: 2
guid: de088c15c5e19472981198726aca0baa
timeCreated: 1518230924
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName:
assetBundleVariant:

1001
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgentVisual.prefab
文件差异内容过多而无法显示
查看文件

10
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/ExpertAgentVisual.prefab.meta


fileFormatVersion: 2
guid: e0c2f723f24fa42cbad86cf8e8e6f401
timeCreated: 1518230407
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName:
assetBundleVariant:

1001
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgent.prefab
文件差异内容过多而无法显示
查看文件

10
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgent.prefab.meta


fileFormatVersion: 2
guid: c7684b8f068694edb9b432c4a427e36d
timeCreated: 1518230973
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName:
assetBundleVariant:

1001
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgentVisual.prefab
文件差异内容过多而无法显示
查看文件

10
unity-environment/Assets/ML-Agents/Examples/Banana/Prefabs/StudentAgentVisual.prefab.meta


fileFormatVersion: 2
guid: c991009c529854b479276bdb1c5f962e
timeCreated: 1518228619
licenseType: Pro
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 100100000
userData:
assetBundleName:
assetBundleVariant:

450
unity-environment/Assets/ML-Agents/Examples/Banana/TFModels/BananaI.bytes


@
state Placeholder*
dtype0*
shape: ����������
ƾ
dense/kernelConst*
dtype0*��
value��B�� �@"���Р��bm=�">`����)>�=��齻K���-<j{�=,�\�P�\����V�T>+��&��@
��僈�F�=Nq�=�{����R=a=2�u>��=�\���lj��^���x�*�"�0<�ϙ�?_t=@��=:�,�孅=��Q<���1;�P >'
����ȡ������7���d�G��=�"�=3LD����=��<�28>�/%��B�*�>���;��S=����߶A=]�����6>��X=;�<C4�;���"Q>Y-�=�(� >�����:�a�n��=#"><s��<��Ƽ�야:�>B�����>����Q>�u
�s�i��2��iCj�c���\>i�W�l�=N%{��Z�=s#=�`�< � =Q�>o}���}�=:#<�\k�񑽛y�=�->�/?�V3R<� ��a�>j�>B��WN�����=��B>��j=�p>Ҹ�=���=:u=��=���<q!J��ނ=;�L>�4�=^,6��Խm5&� _�6<�=�W�Hټy�=�����=�����JL<%��S= �>�}/�t©��+�:E.��@'>bZ�.��=��N�" ->�̞=���<��>T7�=��_��rw�#t >uل�=��&;��=��������<���=.�k>%�= [�������T޼�t=�7�<K���N>&•��e����%>ϧ#=uх> �
������<��>@�>��=>|ҽ�A{=�b�=U��=j��;9��D���G�=��¼?�<KB�;����M=> ���S�R�H�7E�<D=wS�=V��=��;}� =�����,��G�p� �L��=�6�cwܼi�&=��=��<)kӽD�D�>'H9�
�r=6Lk�d}=.d�<�١=
��ʽ����d�:}�L�� =�XR�!|��s��=:t=��`> ����꽹x�<x�p�S����ɨ
��.m=�=���<�n=�x#=/Q�=< ���5>s��;�w�=�������h�!� 5�G�+�عM>Ⱥ=#:��}�.��Z��~���>A��p���\� x��.>.��=�C������= c=�X��%h>�u=Ti��۩�=z��<�R=dYM��:�1��� ���[�<�mg=��<�;+�����b= �g�ӿf=����>i�>v��<ԇ�����O�P>v��>��=,:�| ����>,����F2>����or���6=L݅<{,9=�U�� !=8 �=_�,���=bo=lx�>0мz����>�༑P�:I誾����y�=:w��3=1�=ԩ��J�[�G��l 7>TU��3���e��>��=��^"�><�ϽtF�=���<���u�=�8�;����Z�>�+>�� =�
�a��=�r��)��=S���^>�>�>��Ӽt0>!s�<8��=�t���h�4�M��F��h9�Ժ��с��?6��ɘ�iH>�'�>���=�)��Rս�R'>�Þ�ʥl�Fa6��s�=^���V�\��=f��>�Y�<w<��څt�d�=���@� F�������K���z9��Q+��
ýЬԽ�8�=��ͼ'�<��>x�J=p��"�=rM�=�#=��a���=D'9>��<���<G{����D=���M_ >�\�=�,<�8>5ܦ��>����G��)�1(��`; �u0>-ؙ�%.>�!M>оݽ�O����<O��<\��< L>`Ć>��<V��YG<ӣ= F��tyE���׽�/>��/��">�e��[�8>ub��������6>�v>� =ų�g�����X�W���e�=���=U/�����=��-���
�ա������?�=co)�un>L.2=��н"ܼj�Ž��������VJ ��W���[�=���=rѦ=`��=:�༏��=e
�4qս����r�ʠ��a��=�9K;��=S�d<�&>���<'a[�B�=�~=���<>�=D����"=�Ѝ�$�Q<vΉ>�e9���M=��=>�tN=�p���=�j�=,�s=s�սP�3=�j �x�p��쬽��S��M>Z-��I=�P���0<�V�8�8���=WF
>�ͩ�3��;��8��MJ�E$��Md=~���b�T=�����w�=Uq=�@�=��9�蝂>0�a='�[���U>�
�>���=0Gϼ˰~=\�Z�Ftr��Ж�^Ͷ���������=�e��mi��!�0�X=?>l�>�½�]�<&�r=L%�=�~����"���=7g>2@���:8�P�̾��BϼG ���,>[>N���!� ��uc/��+�jÎ�����2�=��
>ȯ���Žø>wj޼�Q:�]�;�;\=_s�<YW=}�H=��2<F��������*��u���<$^x��xF���}>=un�=tl �T�r=�g=���=l�;���=l�=��=@���������=d����<26t<h��>S ��N ^=2��=?"+�Y��=���;�˦>��<67�����;wSH��r�=I�=�5���GH>+_t=c�n������;R>�pսV>���=BW=>5�'=��>
f��:��=�������z��=,1=Z[��gc�=� �=s��u��5��<oA�����>P��=M�½Hpt��>7���5 ��Tv�yª�$=��sFd;>ݎ=�3ƽ�;6���7<�,=������<��=����~���{S���=‘�=,1��H��<߽�$�<���Sн���>��j�u�H>u/'��3�=�����<��~Ƚ@���<����=�T��JH�\�7�'���݂S<�Q1>�=��S-<�"��vl��S��=݇�� �9>�|=��:����ac��{W����Q�ɼ�.��c,-��.�с޼�7=~5H����<5e(>������B>�Y߽H�Ǽ����}t<i� >Ѫp>�D�<��;���=���=⿼/�>��&=W)�=?��=(��>�ճ�XD >��J�N� ���c=��������<�݇�f>6P5>f�=�c��=u���]�<]�>��<�0�+�,<�9�=�ד�����JI��=��>n�@����;�W����=)���%>e:�>pp�_�?>��{�zl�<�=�=O)N�DEA>L1>��=]Rk�"K =\z= ���u0����<�p+��������ƕŽ
��������<��=�ͽZ����v=���<���I�f{k=���=�vG�Լ��y�S=�44>~�=�a�=��>��S�� ��`�V=�h; mD=�,���/>?�D>��>c�$�xa�0=�:�< �L<&t>e�\ =���<$�=Ik�v�=��>\R5>�"۽f�R> q�=w��=��>��[��/�~<K=��D������=���l� ����sD>*���X��1>��=+d��g)�=\��=�a�ɉ>ٴ���=�@<�{+<����>�<�����5�ߛ ��o��r�f>�`<W���<����[=�h7>���<�?�=�x�=Ɂ׽ ��=�<�B�=���=�t�;��q">dg8�_�=�k�K����;Oc��@�
>�A���O>M)�;�m�=0w$=�t2�E�=S�
;(���@���#Ej�‘�<��<1B%=�T�������=����3��FQ&< N<>�.�������]�>Z��=�"9�>�-=�)%�+-ǽ؟>>��c��\(������=�=�l=c�@=+�> Ot�TE7��>,ƣ=�������e4���g�=p&>��8�hM=�uܽV��<�X>��<<�f�>v��=cu ;l���� >.x�;��=SKν����v����/�����=��J�.b���L�>*ֽ�n��+W��K:�ӗ5��d���K>n&>��<�ȍ�=�׽V��>ɾ?>?7g�!�=����>kB���a~Խ+�<�Ի)ʽWE"���>-�Q�B-$>����|�=� �ź�=�݃�M�5>���<)1)���C=XP�=�k=嘎�C��ġ�=��A�IA�ݿV��#��4�;]�7��+��֔==����^ =��>
P =�1$>[�������=���‡�<����%c=-ؿ=��3�4>Ĺ=d6�����1�<=܂>&��=�(�< �ɽ<�=*����0=������ >5q(����;� ^=��j�,_{�Ԑ��t�=�?�����;&�׽e�>U �=am�i��=�����w<^�����,=�`<k5��e��=��>���<�&�<�l���΄=V��<�S�=Aoս�w7���9�b�=Hp=R�>�]нP��'�M>Ds��`;��4 >k�j=LL=C:�%��<�ֽ��>�V�<
+��0S=ڢ�=7Bd���=\�)�շ�=C��= "u��>�Nt�������>;~/C���&�:Q[>{�*>o�:HA��r�>�T�=�皽�G�;�0}�/��=N�d;��Y�^$>4�}��4�=�L&�W��<H�O=(콟�3���T�!��<f ����:��CT�:���A�N��;<�ȼp�r>�ȼ��U�>9���*���=�ٽ����R�)>��� E>D�ʽW}��6�>�f>��'�,1����w�Ƒ>2U3>]�*=@�T�z����˽=��I�0�����I<��(>����=�Qg=Z�<j�Z����<#� >���=���zi��1Q�=��v�f�%>��)=9�i���������v���Y=֩��l��< �.����+m�����z��ɪ=��8>zoS�y�=ڋ��� �����U�=����A�H=�B�%A">���>� ���A���2>�Z�����<t����'�i��=��'��i >��=�
�=S��=�= o6��l�>���=NO��b#����<I�_=8׽��]�^5ν3н�/!>��Z=�VS> J���p�<ILнU��hX<n ��#[�<��9>���=��zb�=�<��$�#x�>�2=���=`��ce�=��1>�ul>n�׼��ݽ��=)�X>țg��ʝ���[U½acQ��!����Ž��=�WkW��l��
�=����8�9�VC��<���-�=b7���TH��*:Yn�ɲ��K�œ�>��Ӽ���c��^�ս�M��� ;���=��=k1}=�����=���=g��=�!W>����PT�=��\����>�<�G��LT>����(�F</���6��<�T3�g�;��� >���u��=��ٽ9�=_� �bP�;��=J�b�;<��災-������|㼽�;n<�l!=������ּ����*�`�>����U�=6�<XmK���l=�-�n����s�<��ټ��>�X����<y3�>��#��tR>р=�g.���9 =�;�=Y���r\���E�I��<������=���=�?< ��=������YE�=�5 9Y7�1�T;�e=<b=��(> �3��������s�>jsV>A\7>Hd}>n�����;���i��&ܻ�����=��J��'%��"��\�=hS�� ����/>�>��:��<��拽��=^�j� z�=�a��#2��k��]ͽ�sý�����r�د,>sf$=�ճ�w�t��`��{�>?)=ڔ =؅�I?>N�ż\e��tN)=�b�=\���m��=|
0��d��
��=4���r�Y�|��5,��G+=8��>��᥿=��ʼ�������:H>�J�����G�޽�b2>�Q�8� ��ے��rȽ]S>k^>�D�>P�>�M�=��">��>��!�� �pw���6=������%��7<�Q6��q�=���;E���U%���S�B9�=�->�} ���$�M[4;��'��m�l����^�=,��= �p=E;���z�=�#���-��ѕ<�w�<!�>���� �J> ��p����f>:����RN>"�0���
>�׫�%���6�彼��=�ւ����<������="���Q�>H��= ��+���yJ<�ʕ��N,>���<e���p�[L���t�=>< ����q����5�=<�ټ�X<BbO�v�Q>BU>���=M[=QJ�������<����\���'�=��2>tt=?��!��;�d��R5>5���� =r�#�x<�:!�=�ἁ�>��ܼ�e�<��ν[��=䚐��ݫ=���?��=�g�܇��s��π/�o�<��> ^���[��/ԽFX1<�L�=8�_S;G#n<J�:>������Z�U�i�Tyc�����ͼ3Z�=���
�=�;�)>,�[T&>9a
��5">���=��E�bi�<�^�=A�ֽ�ŋ>Fۯ� �=��ýFO�>_ )>井�ː�=^ *=�9<4�&=�b�xj�t�<'D�=-�:�Ej=�DE�ZB>�'��=��h=�Q�=�3/�3�ɽ2��z����"�;�a��9��==�Ž���� �ܽ�>D�s>nuv�S�i�o>ӧ�;,VϽ��Y�O�޽��/>��(=�%r>T�7=7|�=��½�*�=|Y>>� %>%�>=��޼�g�=��;��K�=�x�=�཈��;��ֽ%~�� >���=֋g;<���\�;��<A�!>����g-=�?>-�a�u*�Qm=F�7DŽ�Ysι���=@��WW�=�I>�1ۼt��uI�=�½����T�ż{��=�m�;C~m���y����n�����y��=𹡽uG��3�=��B= ��uU�=��;��N�<{󻕒��h�=L6���9��~>m�4�������'�d=���<�����<ƛ
���=�r=Pi�P�>�Ζ�#�=��6�Ͻ��_=�s�=��>/n)�W��=�䴽D�S<YG��S^ν~�׼�u%<��;>D��=`�=S �<G��=������ƽi�M��M(;�<�=>�:>g�<���Γ����]<h�L>�H�>F���� �}�i���>i �Q�����u����>� z�@��=I�<N9_>����H�a����=�)}���b��i��}��>�fQ>�U��Ϲ%������Lj>����I��<�f���ս`2�7R�> �&> ۞����=~?L��Mž�oͽ�/Ľ$`��A��d������ V���=��q>Fн��&>�j��"�>�>_v�>���a���#�V�ҭ�=��M� �����W����=A� <.���7>X9�=L񽛛W��+Q�]u8=�����[�v�s��6e��f�<q�:>k5�=�
/=M�����=+[ =� ~=��I=��A>��꼈��=&�<���1F5>tͽD��:�Sx>z�$>��t�<Yr=ě���T
>� �"�>`�j<A>��g�]>���<A`;>u�!<�:>H51=�C��`m=�l)��ߥ��z"M=���²��vv��*���9=Pꁺ�Ƚ���=Bk.>J��=� >U�>8��<G]�=����<�>���ң����x�������� ��=�n���1>��f=}q�=���=x���� 7>J5>&D�=&� � Fd�f��=��������i{;xY�<����%S���Z=��d��¾e��� T��x�=�񆾭����Ҿu�;�_I�b%��^|=o��>mlF��GR=���=���c�=�w��e��=o!����[�c>����\>' �<����u^Žۺ����Y>`��=~S>j�ٽ˶D������<)(���u��k��>L17=���M�����=ix��G]�� �{�hIn���>� =�3<'_�<t��=sh>��;�J��¼@ҼvJ漗>������=�p�=�l1���F>L ��X��n�Ѽu =��E��&���������}>p�'�y};��� >�>/���*��0_�ҒK�K�>Dcȼz�Ὦ��$�;1%>�4���2�=`�>�'�RGV�W�����;Œy��P����5=�6�j�=p��<q����aP=��� n�;�0�=+��g9<�}^>��>���=D�=�`��]ź�I�z>�^9�F�<�6<3���f޽R:�� ���Nq�y�=J��=KG2=�M/����>����U��#�>a��%=��7=ōg=����}&�s�>�԰�7��<N�z��� �>yT=N�>��>��h����= �s�؆��� ��yl=p0��� ����=�G�'�1>Q'^�5��<���ͳ=Jʾ��;��=��ܽ,L�g;>Gu����=�?��ω�� ��<��a=ƚ����=F9߽�N�m��=��!<�Wݹ 1��U2���9����x{�T�]�jB���I=��>���fj�<h��<�K�:_���� ��"e<�Uh>.�,�áS�-c�� ���=����X_�: |�==�ɽ0���.F�2tǽn7%�X쉻մ,;Q!>�����ҳ<U�.=�JO��_�=����!=؄�<E�&�SŒ=~��=��>��=H��=��=���]�ϼ�i�<��<��*=��Pf�=쳩�-(>��9�x*x�T>�<�W�<�%;�U'>���= |n��S����s4u>'?����8���<����$>(�>6�X>Q@f=<V9#k��C�u=��<A�]=�v8�r���r�s;��8>,�>�)q<A<$i�=�컽�0�= G�օ�f�½>MU����|��џ�<�>�ӷA=1+�^��=�P�Z��=���=�ZI=-"><LP�;��z�@�i��� <����߼��=���B�>M%W<7�>,�w=��=�u)=3~�<��k>⌽�["�=B:V>����y�>^�:>��>C&�'zn��"�p�n�<��M=C��ʯ�D��=y� ;� =߉���:h>G��n#=�����M��t)>�K��=���<4��s-�<\�^=�n��,� =���=�:}�h �=�F˽n��=J�+�Y��=ث��[>&:��΃�<�TE�z�B��f>��(�����&�<6F��iW�=9"�� N���ʽ/� ���=��S=f�Z='"�=�� ��Ҷ�,D���x/>&��>j�y�)N�=I�G�C�`<D)^=��0��/>���]�z>��>�剑�?M>Xz$=kz�H��C���ApK>.P=��>)۸<�]4=�"l����n�S> R��j��= ��=�2i=<>K�gxQ�s�f>x��=���o������=��x�f���;1��\�Ľ���=��׽;kͽ 좽������w>x���VJ�<X������ ��=`x>H��=� >�%>V׎=C�>�3{=CU�<Ƣ�=�o0�� >��g��a�=�˼=�����ͽӃ ���=��Z>v�)� ���D�t֋>���=�ul�mo�=�57=c,�>�ݚ�؄������GA.>xM@�P�+��lȼ���=��*������E>��=��ڼl �=� �=�oϽ�� >Qҽ�Չc>�P��`�>z�!=^ �=-Å�g4������l��V��<��@�n�=]@x�l�A����8�;� C>��=+վ�l/�,͂< �3>�`�>T
�=������H���Y=�{�����=�@����Ža["�׉-�s�=ᎆ<_���\=>@==��=��_����=s��X����<���G֧<��=aP>=`�=�_����:;��f��3�=�5 =\����>�� � ����A��>S���~rH�� >y.<�h���)��>�= [�=�C����I=� ��l�����������BM=B�k>�O0=�
�=�������4/�� �]����>]�������˾�=�>�<z�=�gX>@o)��(���� ��fC���.0>���\��=��ҽ8�<&,��Q)���:>�m�=��,�~*�ae�����i�=� �=
�>Lф��df<�.C��?�<��Ѽ({�=)������>��z�삷�D�=���ϸ-�"�c ��T��;��9��#���O����gT#�ڟz�?���5'�~ȍ=��=N��=�����u���P=%����=��ܽ_�-=F�Z��kG<��/�=�����?�<�<�=3> �%�� o;Pv��4k8 =�ދ��ݍ��U=���=gp�;bǻ�VvL>� Q�°��W��=R_�\=tb���C=?JS=Q�3=MD�<�6���.=� �<3l�=s�>�C�����=���g�G�lԥ�J�۽$iM�*�;>��K>ȷ�����=��;:�S>x.�=��+���h=!�c=��j]>>�����^��->I�>ث�=f�_��}�=8��=S\j�a�=��=ե<aYu9����~�� �9=�b�+�<� ؽ� ���=�Yڽ���̹,<լ���>E�lI��嫼e�7���*<���������O�d�=�b@�$�� 5;�7˽=b�H0ؽ7,o=�$,���=hl�=���=�5~��5��f;=������X=�����U��+�<ƕ;��=�����d��;9=���P�ͽ�ܒ;<�<���̽/T�<-��=�>�R=� ޼z̤����oݾ���$<%|�9n�<���=h?�<zc����Ͻ@S=B~�=�<͂Խ��>�_��e��m��=�0/���$�e���d������=��Z���=Z�������=�u �%[��Z���"���6>[��<������6��c�= �l~�=�����B��M�=�卉���R{v=<�5�����R:�y�;=��������5��12���+>l�[�}Iݽ�W�=c�<ܠ<��W� �,�<�ip�=��y�z}&>��'��>%0b�� �=6�=��=q���G{�=�q<.n >�N�<�K��b>?��y�����= 9���.���E�_Vd��B4=� �c��=�W�=�3=2R��氾f��>}�c=V���,7> ˖=X�N�+�3>�K'=�nռc�t=�=�l�������=�.���<��M�=s�=�ߗ=��D>�N��G|;�:(�=�0#�����I۽�[�=c+3>B�u=\e���,�ķ��������=�r�<l���
�>|��>kbb���=*���;V�=�e=�|>lŠ;������y<����.=�'�½�Ao=�O6�,[�=̍>���=|$�� ��:�� >������=[���'2�=��=�־L�D=Z �>r����T�A�k>��T>�=���G�5Ի�{�������j�X��>F���������= �2���y�����E�=hV�C��=�*lp>�A��T:�ge <ρF>�٪=Qa�=Y�.��ɽ��D>�|
��ց���=`i�=��>��=�9����l<� '����>�Ox=��+�1|>ҏ��S;�=�������=��<���=��L=[LW=�ݽ@BQ=u1�<N��)�?>�:��z�)��n���<[nT=�!�;k�=���=C���/?�>X=͒μգ�=�؈���V>�3 >�S�<�(>�8'>9��� ߃=�Y�=x�,=���= ��<RN>N�.>�ą�����cq�|�X<-T �=cg=�6�=;���9��<=����3=�:8� �ռCQ:6f��[]K<�'��X}����;�:��3Ԛ<�{n��6̽�J������X�=&�:�e�S޼L�9=�5>���=�V=mY�<�������2T�=�q�=�;<��������{�ĉ�v�O=�(�=�̋�娄���=|�;E_L<D�ͼ��}=���=' ν__�9�q��N�޺=1B����F=��� �c=ρ���O:�R�=Y�=�7������Ux>=���j�=)�T=�s]>��I���>��N<}t��Ӝ;�`�Ƚ�=t�=gu�<{W�<��g�3�G��%_=g�<��=�����)���ǽI�"=������=В=���J}�=P@�=\j��V�Q��?�Tw��D>܋��ِ=Uy�Tt����<U��mV!��\<Ш<Ă�ņ �3�'�Ƶ�j$���}���==Or�t��=��>�܃$=���=\9�<��=���<_A%��W�=�b�=}S�=dYS�g��<[)��]����E��� �� �=uc��#'%>�Vx��Ӎ��c=O\�={���uD���b=��E< ��=� ;>��,=ڢ����z�w4
>O�>� ��p�=��T=X��=��>ޓ>_̊��S�= �mr��,s<�Ի� �=����X!=�Q�����<נ�T�=�+>`b'<�|=k-=a�����*�"f=�!���a <{N����=ւ�=��t<�a�=$�� "}�����M"�e���=�$�<9ǐ=v��;���=�nb�C�F��<)��f����<`�q=��̼�5����v���+��x<�3>n��= �#��,M=��н�ɻ;ն�|�l=��N��A|�ܑ=���=f��=�� ��G�=�k��r=/>Gs��Z�<�%�����=ύ �����E^�� Z�=���=���=T]��O�:�<aP�>-T^�����c����@=��=���=��g�PG>����91=-<�=5��<�͗�3���d�>Zݦ���/Vĺ���;�]i��N�=�n=� =�����"�<
�,��b�=`��<���=��k� =ɼ>�>=����H��<&4=�ҟ<��=�#s�FB�=����(�c><���a���T>�s�fh<t�k�W < �j:�����A���I�>)��=�n=�����5��Žg��<���Q��=~�> ���^��������=q��=��޽C����{S��+d>4]�d�½~">?��=�Ѽ�ڽ��>_S��~�=��C�]�ܽ�^-� �����F>�Κ��>k^�?��=1I*�wT>HY�9K����=�ŀ���U=t߁�8�>C���
E����=����.��0�<�jj>_)ȼ�U�=����W��=�ý�lS=�:�=���<ث}<3�k��B=s���\��|>f�Y���=97��E��;�ΰ=0%�=@���Y�=(�ӽ-{���p�SŌ�^SN>5�Ͻ��3���q�7(��I2*���>��K�� �<Q�׼[ټc����<DL��?��<�s��}�=�������8�-=� >E=�#6�u7��R��=%(�<���<ת�>�N>T(�<%_��i�n���;ܩμ��=fF���[�E���L<t� � ?��a�&�$<B�f<�h�#5>އ��u/=FU>�z|=���=��7�Rq>����=�<'�ӱ�=//z=?\V��Z�=��<�'����^�>)� ����LX4>s�=f����N�i�<���6̕<�:��^��sv�P>�p �6� �y ��A�=B-a�� s=��
���+�� s=�dϽ�8,��bT>)/�b���������ួ*>������߻D��=- ��lp����>�y=�ɛ=�Z�=\�>�5@>��?>N�=k�>�>^=#�=�>����{ =h޿<�����F�%@<��<
r��žʽ����R�>���=T�� m>�v��W1[=�� ���0��ڟ�b[;��=�D�=z�v>��S=ɖ-��_�=�>�v�=�<x�ӽ�$/=�8I��l=�=_���=��=5��=S��=���=r�.>꧜>17>�������/=�(�� o�=�e�X�’���6�����v5�=�薼/�=Y>/���m���= �;%��=_W^�@��U��;/���H=2�Y�(�ڽE�#��X�>!�>�Os�Q��=�A<�>9P��nʖ��=3�䏽�ƽy�c�6������X[�׎����>/dv=�މ�����ź.�������=�Q���,Z���ό�?��;W^�<q�=�x7�a��=ˠ�=Ch=�3
>�n��6�*� 1>zN:���=�H>c��=�E�=Kz =���>Jz=&D�=���=П�>�@X=6iW�0`�:�O�=��>��s<I+��(R὚/�= ����Y�b܆>ͬ,=�.o>ßU��<� +>�p��i��=]7F��+�<�7�RF@>Q��>�A�����1�;�,6�FV�=/7I�X�0�(�=9��=`w?��K��’ �3�f>cH��K!ڽ[�������0ۼV8>ٗ��m�佟mx>`��[ڛ��N�����
Qན�Y� ;�;Š
�U�q=T�=��i� >&�N�!U��*�9 N��&I����=� �%��<�A6���<M<4�[��!��% =�]3=�H>�6ʼ��<>[=�A:A�K<��a��9>FԜ=��<=��=������/�{�ἀ�ϽB\�>��A=P �=�l�f6�=�W� ��=A"�#�<��;<�=�?��3J>� h�d7>��;�mU��>K�->��>SG=Z{#=��>�TO=ئ���4��e">����i޺~C=�0���&�y���g�5�w���S
;4�=�>A���Ǩ�� �<�߽���` =�,���>��=h֪���_�$r>�2'>��5�
���l1>��->� =� ��o:=�M=�J����>�!>�W�<�Q�=���= ��=H\I��?�=����L�r[o����=�~�=^�+�GI�v��=���,S9Z\=�� �we�=����g�|�ct9=�^4��"�P����I��l���?=�c���=�T>�X�=,a漛�/>��B>�� ���к..�0������K��)��>P�<�Am>mm�=��g��NǼ��f=Km��@3=
�n=.y�d+�:1�!�`N>�z<��1��x�1>MG<�Ù������=U/ܽy�!����<k���*R���~>��=��<�Y�<�A���a�\DN>��ҽ���=r���/���G=ո
�������j=[C�������>����d1>y�>׸�� $��ϣ=�=�r��𽦕M=��'>㾧��!�>It�=����M�=�E�=�\�ˆ�=�nb>o�
��{ �/�G�<���y���a���햁>���=�� <��(��Z$����=��3���p�=��ݼ�4�P���߅>��Ҿ>��=�#�=D����.>�s�>��
4�=l��)��=0Я�㌧=��H=���<"$i>EH�=��"�������>��=�3�� ����=b�I�!�l= ��=y�0�:k�<�ߓ����=��>'佈7[���c�1p >�J�>�1=}I9�z��=�9�=��=��a=,��;�@�M�/=%=v\���x��D����`=$}~�P��=I!̽�x�=��>�J>g=�eh=x}=�>� �J¡=�'��jC���=M��k����ae�dX�<l( >�܏= y�,<!�O�)>{�׽�>��`>������=��Z�ɐ��o*\�(ޑ������F�j]j<{ӟ=��=^<�=8��<ݑz=��=g�>�?=��g>V�>�Ѽ��b=bS�=�*�t������W-�<h-@>B�?�3��=qX򼦽M=tl��������<��>ئ�=�%�]��v\%��)� �L�hq>'�U��GK�����ZC�ZR�=�=r�֝��̞���4�>�4�<���=b+;>��P=�ꣽ�f�<?S�;=IH�YB.�;��<�ї�5����=UE��~*�=fH�������x�=쁋�c~��� ڽ�y�F=C>���=��罰�y�O"}=�l=��=�@%���=۽�� d����,>py����<^��=X;=_�����=[��="�<��I=�[e=�̽��ƽ� ���� �O~���H��g�<R%Y���2=� �m>��9=~�>����I5;^K�<�P���I޼���=*�����>����sZ����=0->���{�<�渰N== D�=s6�>�r�L<����� x=PR�=u#�=}i��M�½��(�a��)Zb>� �=0�cZR<�)��ȩ�=�`=Ŏ�R>?��?S<��>:�[����=�T�=|��?�=�2�͙�:�w �+�|o.=��>$?��=P!�<���h3�=��ټ�}�<y �=e)=�jy:C?�$�K����<���=[5��^E >�� =����b��< ��=����x����W=�qT=<�������f�>2<��<i���+'�=��>h'׽��O�Z�k�߶\=�D�=�*N���<ЕX>Y=j�=�6�"��,=Y%��q�[=�6�=�:�MM��Q��Ǵ�"� ��/��q����+߽3AQ�,� =ZT�;�~�=�g*�$�=���;���=J\0�C�K:. $>�#>���3E��AK�@��'�E��|�=�׼�@n=~7��
>l_�=�ͨ��,=�����h �
�!>�==*�=?�N�6G�9n�ؽ>m���>Y �������r=���)b)����q`������Z� �����޽�� ;��;��Ƽ����|��=�Z =/�V���<_M������?�=qԦ;>&콼g��E轙ǝ<��'>�(��%�=M��;���hL6�L��=�U?=� >�W&���ǽ6�6�lۙ�'��:���=��>Y�7>ڲ'>��ѽ+�����=�F1�j�����z�?��<@A&�G�������������>}�>t("�����=�n�;k>�p=4�= !�=��׻�� >����u�=��V=:gs�s{�ī=��:񏋻�O�=iD>S2���彰�=%�ýrS�<f��B�!>"�N=�#=�ݽ��@<�@����<�&�>��q=P/ӻİ��Gp�=��==e�>��>�n$"=~��,���;sܽ =��z欽�؜=�s�=�c*��.�U��^�x=�׽ q#>@��<�����y �"l�<����<����c}�Zf#>7�=�)G=z����ͽ ���ާ^� $�=Ls���hc��>Maܽ,޼�(=Vn<�Y�>����0k <_'9��0>��)�.���B�=�v;����;5��=���=?�=/�=������y�����L�=���=�_E<M�1>y����l<��=s�=j=gء��/`�`� >�A�=�rh=
�^��w{��"��g�=u�<�y��_�=O,->n���aYԽ%� >�=�����=�2>Hч���N���E<*&��4!�=~��=�����=��=~;P>)W����=�Q��7�=�q��c�]>�bS��Y�߸�=G����,�L|��1�ؽZ����U��-�%>������''=+XV�\�ռ��^�c��<�C�<�a�9J�<Z�ϼ��ֽ5�=Mׄ=��9=O�#�����8�=B��=<> ���H&�H��=����~��=�^�==WL=?@T=�j�Ҍ�=���=�Rc���n� ���콫�
�Ze>�=�` =3����X��!>$ǃ���;�E >�r�;��=���=ו&>t�p�+J>4�����<f��|���F,��)�\��yڽ|��=/P.=�&=y�u>��=u$�=|zp=ͻVa�>�����Q���&>޼>��=`>8�-Z�� t�Rj/>G�Լ�P�<4t�=Q����'>�
\=�UQ>Z����=]���O>�hν�6�=VO>����f=�����q�=�&��D޽���==a)>%'�<�a�&�����=��n�y� >
�/=G�a=�ё�1�=�Ű=K.۽GЦ=�>�(����Ľq[��n�T�@�$>�og�cbüH�D��r�==��=�;���ꬽ�)>��m�l�<���y��&��P ����=�h��>��<>.[=�b���C�=���<)�f�b[���/��w��<�}�D��գ;�Y=�R��ۆ�>ge=��u=��<�K�� ��<蛀=?��=�}��O�=>���ĉ��?p�`/���B=�K�=�f�<N"���e<�� ��̾=A~=�k=�鹽:='�q=���=�;}=�ʽ� ��= �/�X$<��뽢u��XV��;�</�*>v`4��E��#I�WD=ͣ=xּ*̍�8L>m��=kv��h�3�#��]��=��<p���V\�xb��L>vY�<��=��<Qe�i <������<���=.,�����=�W=} �[�F��Κ=��#>3|I>������{=�|�xJC>H9���r|=��>�y��Y��礘=�R�=��=��K�����pra>��(>�A�=�ỽ秮=��ܽ[~@���6��k �3����s�<K������G9@�fk2>��>�K+�=y:�=��5> ���?2�_F>qWm�� ��c����6<H�Ha���ѽ�S��T_<�a�=��W�Zy�����=\l><q���s2`��
���ֽq��=��½&8d=�A���1�z �<��L=Ѽ�79��?�=L�=��>p�P=��ٽ �c�L�@>�o���*ƽBYz�~;%=j������Be�U�i��]1>k�d�!����>���<��\>�2Ľ�۽1��)���{t���j����<��8��0�=ڴ->U��<���= ��<�nU>s�+>,O�Y"T>p����F|=�C =�½���cU���;��7����x�[����ϓ�|�C>u ��%��|���z�;=� �A��� �������+F=�� >��*�����K`�<���<�}�=��N����\(I�����0G=E�R� ��<S�k<dm��ՋV�zϔ��p?�In~=���={�=<TU{�K5�R�=�J�<��{=���<���=U~\� R'>�����F:�����ʡ<Sk��w�=�_]��|�=C}Ͻ����e��=`>�{�=[�C<F�I��>�=�=� ����=�U���""�A~���Y��c�=��=_ ���Df=�瑼�*�l ���=�T�= P�����=��o>ڠ�<��'=� �g�.=���=*(�=j��R>rxO�r?>z)/�HȀ<� 3�=�[��Z�=�Ƀ���8>��7�����>�J>CHw��������=��_�uЈ=&q�=�o?<�/T��<�᳽�N���V<�e��'�]=��=���=^��9��>$J=�q=Er�ad�=��b=Y���伵� ꍽ���<���=��=�����>/t����=�����檽�� >��R=h�j=��>Ex��R�__��eI=<��<��Q<?��)�w>g��������D�i��
s>(�)>z٢=Z��f���l����<P!��r�U�>5[!��u�=?��=e�>@ar=1=S�������c��L[>,���ڊ�˫����L���%=un���� �ܹ�=�L ;.�����#;��A���3>(*��"=>�}Ⱥd���dO¼�u��Ӏ˼�9ɼ_p��?��=g
�m�ڽ���==pB={��;�7,����=N&/��w)>y0�� 3�<渞=[}�=)�\=3#�=�=.��gJ���9�J#<��u=�b�<Wi����=��>��+�_����o���P��;��=�2<�T�=�{n�N���.��K`6����>Xf���3��<�� C>bp�=[��=}��=��5>� �6t��6L�g� �k^��w�=��G����>i����=�>�����
�i������Z�=�E=1U�= '��!%�Ҥ����T�b�2��ɨ<x��>~�K�+;�=�=�Hf@��Q���+�=������ >95== �����I޽ ��;��Y�R�=t罳6�� ��)��T����=W>�R = 2��2
0�#�����=ގս�⌼˺��+�=�0�=�>5\=AJ3=|��9�>C�5���<���>sz[=+�=}�.=G�ϼ���>gG�=�4żj��=]�=���=H!���/����<�H��^��<{��ei=�a�x-۽G�7�r%=�/M=q�>�� =9�/>�%�=нq}ཋ�n�w�׽�fӻ�==��~=���=�����ޮ��D>]��=#��=&��=����*�ۏL=��=��y<73p<�+<+�<��<����g���~� ��Z��ƕ�|�a�`��<'�=qs��� �=�== �.������9>p�F�]�H��D�=U �=��5=�����<��@�I!�;c�.K�=t�=&�=���=�WE�jg0��H<��=�8>�ó;� ">��=^<��RcA<����U��2���$>s��X�v��]Ӽ�e���g6���=�̽�� �Bco<����� �=�k�����=�����^����>|�y��^>o�����<�:�ś_>ӻ�>O�E=��߽߯=����h�M>Z5�=$V=so;6��=�w+=�f>uCA���ѽ�4潊C��43=Zof��:Ƹ�s��6?O�h�Ի>��<�hU<�œ� r�=v��Y���C�=���=&T0� x��'s>`��ّ����=���p�� {8=us1�&�;��ռr�{>k�۽���<�@�=��7>�9y�c��:v���nع=�4�����<0�m=<d��Xa�=��i��)�=���S*�;�[˽ 8�<`5�|��=�����ͽ�0��7 >ˈ9>i�P�i"`�IQD���*>d���"�9>����-�=��63>�u=���3�Ͻ�lr=� �<
%@>��V=`�)>K��;T�6�y����N�=W�=���=�u��s>�J&��{,����<��n<���;��=��<6��@<=R��=�-�=�l� ��"j>���=Sa�<i�X�d2����B�g1�<��V��g���J=��=�Ѥ=�.��|aR<`������=,B��]�����e�=�C >Z��>E�ʽ�;��~�ͫӼu���I=��>�{��1޽���=w�=P�F�)`��]q;=Z�⽀��:PѼ��R�Ԃ8�_�4�˂3>J����=�Y�=����!f>X,���1j>��Z�us[>�:`�� Ѽ�J);�vZ>ݨ�<�˘�Uv>f.>�(Ͻ�t�=]7�=_���1�� �:>,z�M'@=�W3=¡���潏VK��������<�Ӝ=�lj=�;p��=�= P=}��=�F =ck�=��=�rf>�� �= 载Y#��ہ=!}��!'ڼ��D��w��>b�=�F>��F�>Ȯ�(v����n>o��<�y��#= m���������=H�U�X���w�Ӽ~��=�]�����<1�*�rh=��=�p1>�i�>� n��9�w�=��|>��M�I�<�"�=~t��1�>>�[�=21��$�T���7�g���^~���c=�x�=� >�D">�Z>��k�9A�=R)>��&��:P=m�,>���<�[��^>W�޽A��<��=��� >�N>��
=_����#:���f����݌�<U���<U<E�~>[n�l�F�
V��o�J����H<��1>�N�~{��D н G��nӺ�z�<k :�{�ڽn�=��_�p�I=�b:=,>��φ�<$\�>�='�`=���� �=���=�8��a�J��ѷ�б�>(�>4�;� 1��1�
�|��|.>�{4�X�2=����.�Z=��> ��;� n=U}�3��=<��=��-�,�;�5��km}=r ߼�T�%��=���k��<h>5������f%�o4>:���=M�>��H>o��V=�S�#x<�<:=������=��u��s}<@˽���(�&�~�����(>�͝<�� >`�z;j7��'M�<1���TR��̽���Դ�=k<O=��2={����Þ=��¼]�g=)A�=��<�vý�7<q�">b4!=&Sh��� =��.��`=��J=f#>NͰ=c��2��#o@�K�L>Xe>\ �9sy�|��ڷ�>�齆�w>1�t���=>>����=}��=|u�=�/�X�����¼ �<�m:a桽���/�>���=}M��y�=R�<�ϖ=�=�Hy=����E�=��<!/�<q���
���~�:1�����=�d����������z���w��F ����H=靿��a>g谽+3k�����
=�?=�h0��ܗ=& �<$n�=z3�<|��<�ʽ���=d<�9����'�=�l�=�g=��ü?>뎣���{=b�4�����e=CQ��o��=9���� ��=/F���.�����ވ>�#�=��������|�����<^\����[���<��M=8 ��]����=���%��ǽ;]�Ľ�@6��ר�_��;�:=lF6>�,��D���Qr��]�=�oq<C��=`�>'H�����=�=����=Bi=s��4ۈ<�����l�=��>9u��xVr���˽�����|���}=�P����<�&�=�P�/��X�=8����9߼O;�>z�8���!�H�I>�Ug=i��= �$=ѾK=�e>���i E��'�;�b=}N�)V>T���Ln>A%>�M�l����t =� K�o.���4��-p�<����5�=�/>��7=�yB=䦽{Ƅ=U���D�=}�𽽶��w��={ �0�:>m>j���=�CK���p�k��={>����P��=,2>�AS;��j�u�&<Nh�<���=k�$>a�=!�3>��l��舽wݼ�<��_p>D���.�����;Z�介�ż��Y�L��<��>�l$��Q8��� �#�{�U���t�(>8w��E�Y=iS��M��=6��L��� �6�����i�ѽ����D">���=!z-����;�
y=x��;��0=Р�=�G�=H8�<{�۽�a�;U��z-
>ۼĽ�n�}��զ���>�zT=�_S=����B����:L�[�M�1��Q�g=�N�>��<�Z�@{��j�ڽ��L��PV>[��D��a�=Ë ��ļ���=��!��]%>�}�= ��=Si�=�J=՟��C�`��l#��G'��C=;� ���<��bk�0��=x�\�g�g�@;ŽMޕ=�,>�O>u�?=_U=�Xg��M���H3>~>�Y>P(;���<�|ǽ:I�<h�F>vH>^�_=dҍ=�]X��x��o�=ѡ>q���+�^�*=;�_�>����ヽ�=�J��x�
�=����Q�=�.d�K���=n��k�F=-�.������O��e�E=�,�>";ȼ�գ=��`=h�\=��g<��׼.y=�Zv=E��=H���T�Z����fX��5�=QY���S<��=s�`>���>GG�= ���d �$u���w�=�aq=e�����=~�<,Ń<x �<h[����%��=�<�;R������(�� a=� P=]��<���=1��=f�����<X?=d$���v&� �)>��Ȼh�m=�<*{���.��;}}�1܄=�K�=ڮ=� �
w1=%�p��'x;v� >]; �ǟ˽�'�=ɯ��L`����=����`�6>�8�= a#<�w����b=������f���fԖ�Ζ��3 o���ٻSH>^<�,�=�lD��S�=*8��2%��mD�.ۖ=5R>s�ܽ
��<��=fj}��)S=����v���J>�5��*�>��g>�k��(����Z=��5>�9U�2��9���=w�K>�*="��=��c���ѽ�I���B�=����(���/����=S���>����d�L<ag�� >�>�<c�{<�rs>�֮����9��ǰ>���� [>�H�/�=7��=���<υ>�U����= �n>���='n7��=,��I>�>*ɂ= �K��=�YR���>kB����3��Q������b�<ɢx�����Qh=��#�D�۽l2���Y���a<;��=h]�<z��=�i{��<���P6=-�=���=w=U=m=��Rua�K��=����C��g�=|��=0� p�=Kȿ��>^ݓ=�=��=�R�<�* ��Ľ�`|<Nο�Фm��g*�� ���ƽ�4E���)=��ȽX��=�Z>7�9�̗�<;�8����=�N�f�0�(Ͻ����'��N�h��!P��(�<eG�=��=`�P�� g=G�߼���]=}��=�d��ޣ�^ϩ����<���<�= ��0;�=Kf�<�.��߉����=�.w<r�Yˡ� �\<����37<�=�V>��
f<��)=o8j;zu�<
�����=\�;����=��)<�x�=��&���t<��<�#=��<CET��dw=�2=�_<<��=!K`=�>�$=>W��pr�=��/=S6=��뽧��=���=x����\��
'>҇m=�$����>��<��.>�t����=��Z=���0"���Ͻ�����'��@�=ޞ�=6��u}�:�+����c3��}U��~7�J#���1�=p��<�������=�0��4��<��b=��v=���=B��oK����K=z��<7��P�.=肼 �:� �n=��="d'�b�O�.���|+�=�fǼ�1 �Փ��:�$�f"�f�E���}>~�ƽ@����v�<Q�d=�����;�� =ٕ�=&`����ͻ 0ƽ8���@���{�L�g��S=���o+W=`�>���<��m=c�<2B��>�=���<�I�#줼�5�<�T#��;?�b^��{��=����c�O=�8=��= a�=.j�Ph��8H^����:��{><�=�h���,�6j�C��<�) �v�̼�G�p6B�1��q���nLn<,�W=w��O��<���4�����d�( >�`���<��I�
�`�C���큽���V�b=i�A>ȯ���!>*Ľ���=ȥ�> w=ʐ�������都9���U-�!��=i�=wEʽZ���
�S�xԽ_�#>nO=5�= �'=c�F��{�=�(�]‡<�� >�����=|�����=����=���|vb��d0�]�g�51���[y��;<v�/����@"K>�O"<*�>��2>��5�-�~>R,�<��=9�n'P=��I>��=��Q�àA>9R->%i\>;�f��+�ۋ�={ML�P���S��yU ���2��Q<2��<���=t>���������=p������~7>"�N�J��=�Լ�[ɼ�[��ݿ|�>݋= vc����5�c;����'}=� >�iw���н���=���>c����^s��w�R��=q\�<��=�X���:޽옟=eݦ<;���o�=2�=S;i��<�C�=T>BT=?���~J��������)�Of<�f��P���f�;��i�=���*��=Mȋ�*"�<U��<ʔ=ٵ
��� >�2�=w�W��4-�X˗��ө����C�A�k�N�4��=V�>��=a��=�|>=�>@
�3��=���=�b*��h��5��י��� ���Ǥ��&��֨���ǽ�mͺ<���jҽ�t���m ��-����:>��S��T<Q��<�<>n<l�4p�=�Ϣ=�TK�Iޮ�P|�;z�X=�˿�������ռXy�7g�&>V�2>'���K �=* >3i�=]5b=�2f<}IO= 1�=��=��@>T���9��<0ӏ�X򳻊�;>�W���>�ƻ��9�-۽c��k�m<�IB= nY�&�f=Y���'�=s��<3-�=���=}�����=J-9=�;>���=1 ���c"���;<L�=�<*�(@>�f�=���)�V��)�&B6����h=�]��q6{=��{�Gϰ=�)c;ȏ=θ�<B���z��B�k?G�(++=���<{ ���?��7н�P<an"��@��^�=������S=�Ә<�ܢ�6��=�r�;��<_��=�*�����$5:=g4�"��<������ƽ4��!Yp<ޫ�<0�:��~�=���J�+=f���� <�c ��_нWK>ؤ�EB =�=Q����RM>3�=Z�O�^�ͻ��r>&������=�B���D<7�&>å*�6�ݽ�R�=S#����߽�嫼�`=� =� Żp��=��<�"�<���= �>o���!z^�%������=8s���5�����b<=�g>��=V�ѽ,����=����
0<��A�<M��=ȼ}B�=S~a> id<QR������� �j���v�������4F ��y���$Ҽ<)=�Λ��8�;5�ؽxy#�"���a�8�%=6��=^͌�sb6<���=h��<"��<��='����u���*>���l�>F�?�1�r����;��>�S@<���<�ʽ��4>e��=B��<؅=`;B���Z>��A<Κƽ�~~=�E���������=ya<���������>4������=ܽ����D4����$=�<���> �>�_�=b� ��<��ʽ��t=��c�B�<�d.>�@���_i�Q�V�gL_�֎ �23@>T�?p��sc=�e���=1=\"�=j�5� q�<0�i����=���k���6}>�->tļ�|b=���=T���pi�����=�����@���5>��Ⱦ�F!��w���W>� �<� _�� �Ps�>zk'>�ph=��˼�Φ<D�」��������7��|{���C < M�7�9�/if>țd<cAE����� �=�{>�ȓ�*��0j>��>�'��oU��)=�J��"'=aKE<[L���!��L׻�Ǚ=�����x!�{�k�F��=�<�=��=Q��<7K�T��b��=[��p�={�E��T�]��=�}���>�V��ed���,<�4G>��<�p�=2�>����U�=��!���:��8�֛�=�0ܻH�`;K����$���"=Z����j=����D0�(#��FO3=fS�<��&���<�Is=���;{�"��ă=m� >I,u�J��;�ϗ=��ٽ��(�g�н� »{�6>|!�=y. >w_
�4�.�_�=_o%�� �=^%>Np�<�TH�zn�=I�W<�ܿ�!�"= ���8���#�=q��%�T;��Ľ/��S���x�E�=9!|�u��=����J��oy�pg�LAļ͇���T7���ϼ̱A=�?�=���󰽅7��b&=,�^�Ne=ʋ�;?�<�`��� �ͬ�=�������;�ж���?��'�=Cz>���m�>���<� Ǽ�T��a�=�ɘ=A��=�������<����l|=�i�=Sx=N@�=�:��b�=^k���@�<��O�?=��=�{��̱
>��>>��齏?=����w���=O<&!Ž�W�:�AD���S=��v�+WԽt�
><� >�F����P���=/� >i�V<�g�='�<$q�=`R=�du<K%�=k�$=G�Q���q=x 9�"�=�ڽ�<��{����u<<d<U�G>�6#��x�>>�x=mP>`^�=B�z��P�d1C>'d6>T'9C7�=�P�9�P�嬠<�lo����>�˽V� � ,A>����=������P>"���Y>��=�j(>;r�=��;>�1=��0>k6�a5���$>��&�y�߽^5�
<��O<0�W�
P>�Fl��������&<>,�=����9�=JbӽS���% >�NQ���ݽ!;
���#���Q�>���<�G�9��=�2��=�`;Ko�=�6 ��>��'�X�<��>=�\u�*˻����<kub�2�>ɂq��>O��ۏ<��������P�9Ϝ���.����<܈-��㊽��z>�P>/�!=� �D㻽�˂<��>��%>g�j>L=1DZ���%>�<=mZ��k�<T?�e��<q��=t�!=�>(jl�}�9�h��=r4g>|�F=�� �������=�i�<" �= �-�� �=@)��l�>;�B�����<xR=�Q�����>6��[)����`�M��<s�>���=��>Cȼ|8�b���.�<���\�=e�r�0������=�N$=� ���>*��^n>�10=�$=Jb>���=ɖ�O�e�7k">,�#�"����:>r�)���������q�6��[��!�mؼᣇ=���=G�3�H>r�=$�1ạ�̼����Vo����N� ==��=��ڼ��>^�l�zw�������U2<�_��B?%���޽c�g����=qVL=)D�=�.���K=¯��ha+=��H=kaȽ��u=9��'�<��d����� �T N�j9>�a�;ՠy���=��:>$��=���=*�z>�<�[߼*�>QXٽr�C�0s>�1%>�
d>��=�PR�v�<,R3�����-=w�P`�<wb�;�o;+�7>��=R{ü�h=2�,=���)���1�=a�=3�@����V4�=��\��Ὤ����`�Sh� i �W뉾�<ۨ�=��3>Bv�$����r�kB}��=%
ݼ�|�=k��5����:>�R��Eu=xA޽�v�<�e�=�k�@ޣ�V нq�1�=)>3�|=�"=>�� ���;�k�=]~�3Q���=����=������g�>��e<]��=����wҼ��;Bѳ=��;�J2����=~��=h�=�8�=T�B=����T_>�S� x�=c>ؽC�i��O��И>)���]3>k�>��a6��c�;'���\K>�������=��=>�:9н~��>�Dw�Cn���E*�e�^=(��<<)"�9%=N/�=Q� �ŭ�>�g���!>B:>ֲ�<�9�<9iv=?�����b= A*=9B;}k��I߽��s=(���u‚���>ߚ�=b=��<f�i=p��=����K7=ڜ��*�4>�_g�P� ��G�fz�<x[�;���Ľ�l=�$�=\Z�-*=��.��R���,u�&�!=���>C�=��=��a�O�n�]�eu7>EB�=)���U!�� �>�a���5�^L>�p���=A��=�J=5O=�
��O��=H>��+>aω�t7�������R>L���)޼@n���dd�2ˀ�ո:=�l/>������=5�����A>;}�=;k�=G�=��n>H��<)��>�J�_���
P�ܽ͡��s=u>�-�
m�>6O�=H��<�[��u�8>8B��w�=�s�>�X}�SO������n�%<{=����2��=��n�>C� >���=�q�<TA>�fY�*��ox:�G����=>��.>`"Q��y���뽀��=�^Q=jr��**=aH��ej��т;K+>
�����
>�� �j�;�l+������b��I�'>�%%=��;�4ڽ���= =�ͷ����= � ���<�H`>c1 =���s�^=�S=^f��Wm��)�=|�����̿=�\�<���=?\�=��U= @�> x�=�`$>���=�!���2����<��Y=��ƽ@��<��v��߻� �;V<>+��<�:�=��=گ�����=f`�>v,m����>Z�K>�_>Ғu�i�m>b��a�=��o�9� �p �Z�>�7���ý���;D���>�h۸�!>�ՙ��ʄ=���1c�=;^{=MZӼ<R�K��=c�<��g;���=K�>�#;��U�l�>���5�=���<�^�c�Ƚ{���m���>!o{<3�A�����Q&>>>����u�.{7=����l�*������½��V뮽̾/=ob>�CL�.��=1�=��>d1��u���='.��Ђ��#>f�=�|���$t�0>��^= .=B>�<q>�<d4<=P~�z=�<<� �C��Ca�=�1>I�a=˽�.��1�d;�"��>�<Z�*'���?��!��2{<C��>�k��~T���>� �d����-��Ӻ����|M�:��h=��ļ�O��66��j�=%�P��nb�Q��I�;���<F���`b>�4�=:O�=���=c�g��=�����C���4��T�=s!½�*A�[���3�ٻ��b��y����>H��=�G�^]��Q>�>��3h=�������=+�����]�Ik+���n=�d���F ><ϊ=�!�c�=��=�r?=7����=����8m<�<w �i�>=�Ѣ��Q�<�A�0`=��>�ޟ���i=D��q\;a�.=��>e��c��=(��+������='"N>EG$�3>[x> ؒ�q��� �˽R5g>MV��@т=��=��M<��-��i����H���2��b>�jn>7����==�p����<>���=���=1�����=�i'<�U&���F>״=���=���=r�&�ʡq�cx�<���r};D��`�>>-�V�~=�=$+:�X\���"a= ����6�<ꑬ�j���[�������=���=��k���2>��.>��i����f���qp=�,�=�y~�z5����=�=�����=�X<Fa�����=7&���A>�)=ڈ�;�n��'����'<i0���iͽ/ ��~����νy��.>��#���<�AJ�=`1����;\5^>��e<g
C>����U >�gĽ'�D��nڼڃ>+��=4�;�+>|�@�#�=�=!X�=hM���ё��=5J�<�)�q����0>�νO�н��d����<:�>)Ⓖ�z�=��9��c���J�=l4>�j>5�I���=s��=
�߽��f=Uҧ=�Z<��LL=��
=>�3>�k����<8�Q��q�=J��Z����)c���>�V��x�V��3�=�5> �������F�;>C3�=u��g6�::�=��!=��!=��4��
�;LU���=�u=�C��k\��]�<&�˽�Jڻ����T�=�i��9�H� $=�Fn>��<0����<`�9>���U��<�_��2r}>1� ��ĻW��-�=������g=Ϫz<�j��9�P<��6�����:Y^=���=�崼.>��ƽ��P�=<�Xh��F�=�J˽���=_"�:�:��<%�k���?<�`>9�����Z���h=�v�� ���S%>��6�jB��O��8
>���ƽbg��h>6_����C>�8�<fr�*��=B4<<�E�U
���:g�^�;�<��x�`S�=�gQ=�=q(�{�=�_����8�AD>�����㽈7G=�:�=�( <yf6;�(���j=������
��m|>��q>��?>����d�=�]>?��=������=� =�����!$�M�<A���7����&�H��<����5>#�\����=p:m��౼>YF=oF齧&��M������1��O Ƽ� .��R���ƽcv>�$�=DO���?�<n�ɽzQ�=��&�T,ŽI��=��׼��=J��<d���K1���P>z^H=���}��X:�=���H�<�\��l�= �����>�]�g0�����=��>i�(�������=8���D��a��f�=FJ���%�=0c�=R��=��`��ݔ=��>sǿ=�N�M:k=�.C<��>�u`=>�'�r>��v$<�퟼F�ٽQǍ=Ri8=ҋ9=�����>T���x�>W!��D��}���1bM<K�����s<~ٽ�@���\'�;�s=������������%>PPк�~K�����Hjʽ�w>m�<i,ҽ��ټ� �=o� �mΊ=w��9���=Q�M�q�%=��>�`=��=�������F:> 1O>�Ө=/�=����q��*3�=}[�<��<zW:��b4��{<�}���~���u>�q��O� >�~�� �=kD������y�:xު���#; ,�;hH�<�C��!�=�е<k�9�p�5=({�=�Je=��H=*O>�����4>�&,>���|.���3�=�-���-ȼ�繽�����$4�|I��/> ��<���y���(� �;�]�;���<��ͽD`�=����=��=�e���#�&wA>���=t{��H���h/�=��,�<U.�?宽M�;��a/=��|�/��<y������<F �>���=���=j���Lp=�w=
7��9���ԃܽ�~�<�Տ=^[>"ڻ=Ƙ����<����%9�S��=��[>��0��I���
6>����D��7Z��ǻ=�f >dvl9�T��nov���
>�輽��I>�R�=ң�ىE=Bi=)8�<��<���<`���>���=XN�v����b6<����!�����<���Z�Wy�;��f=e�-=U�>�HƽLL ���?3�>� >�i >}��>a_I>a�2>~���R�<�������>r$A>���<o`i=�2�=0Շ�ZlC���ݼi� �8#�I��=�h>�F��_��m^�@��>�޼� =����v�Լ������<mFj;�5�[�6=�򼨣���2��x�F��V�=�4��5��<�c�=f�z=e�:>����G>���>#�<��;>�������>����~���<.=)�4<�s >��C=� �;Y�ü� ��DŽ�W��80>U�>�QA�C�0��5�=��g� =��[>q���nO/���ν�,��^�2ֈ=��s��x����=.�$>
�ż�;�=��A>(�6�qޡ> ���'��5�����>l7�=N[&>�g��xJ�=i1Ͻ({#;ՠ�>�d'=x�>�~�<X�;>��̽���=!=����=O젾U=)��8E��Rr>�%�����H}�=�V$�U�޼Oc��t+�co�>���KOw= Y>+�d=�m>� ��4�=:Q�=���=�� =1 ����ֽ�e�;���=�� >/��!>���<�˽�m���=NyV=��_�d�"����=x7;�Q���������Y�H���:>&�m=p������j�>r'/���k>
c=a�/���>��=zFн���� w/�dE��D>W���~��= ���F&R�u�S=\t��!��<z�Z��i�> Я�޼���3����$>�xL<���n������-/>�<N���B>ls<�e��=��U�=gM�i���\���-=%2�=9�u<&�6=��Ž2ԉ��K�=B4x�嫶<™�=b�����z��<�>���'#>i&��ő@���o��$u>F��=�:�<�ש< ��<F@�:�,�����=[��S�N��ֆ�x;���H>|�6�����(Er�&�/=���<^�Y>�S_�b�����h>����v;l<߻���q >In�=Ja=�ZF<�̮==~Z���k=��;>I� ��,���t�=@4�>8�(;v�E���>ǀ�<� �</��=�Ni��C�>�$��F<>�� �e֠�l5�)ѕ��� >���]�f��W >��5=�=+>�q��ʱ=��^��l�=���>0�>�/<���='�Q>�D��x�;< ��4<ؽ��U�� �=<��f>s �����=�|��}c����^���\�"���5�_<�T���a=�i�;V�y�2cѼ(:
>�Ͻ~�#��_��A)>h
�=w`ʽ��ǽ~����S���=�ܽ'�X: ��=H����ʵ<�B&�C����W>�ļW�Ž!M��DH8>�8=�H�=�7_����<��X�=*>�H =S�.=Q���㍽E
>���=/���t�ᒬ=$�U� R�98rK=nIּ�1'�A������q�<!��=\�j>�G>��G���!>K�ƽ���� >)�C�5��=�V�=����o�*��� �JaK>$ɫ�}iB�w� �t�>����:n>�i�=
0>�)>8t��&z�%@�l���� >¸���7=����諐�{7Q>��$>�<����2��X�>�L>��+=,���U��I��{b�>F?>@�@�&��=.*=��*�Hx=����ۂμm=��l��/x=Zg��O+=~�� ���q�e��m4> �Z�ᐉ�@%��s�����=���=5�ʽ��r>��Ľ�e̽��C�YG[<�6�=��\>���<�`=�&ݼMfm>�=�45>��<��=��Ž��=�jnX���=�������=&�ν�q >�%�:��=v���Π��G��=# �;nE>#\A�q-r� ��^�=����2�=����E�0>���=DWW=��}><?=���= 7E>�˽�C;=�����=����n<,�f>f�>�9�=�cټʥX>��N=d� �N#>���6�=� �<$��<��>��\>Q���p���H<��q�Z}�(d�d�
=�i����;���=�1=Tأ�Tkc�Ҽ�=�}
;Y ���:>���w���/�=�̝;�B�=e�*�=�p�<��!���=l�"=��S����=H>Y�=]�۽aL$��[9�Ś�;��=��"���=�������>�J��k�c�E=j �%=�� �2�F���i5�%9>�&�=_v�<� �7i���@�����=����|4w�eZ�͝_>TSH�o;P>���=3ͼ�jb���J>�f�= <��
�ݩJ����= ѐ=>\mT��Y�=Ї����<c���]3�=5�=a�1<+�m��m�=��!>f��訸�z��3>e�"��d�c�+>P� >����ݜ=oSi>x��<�7����7<mUc���0>�|7�Ÿ�=ھ�"�>�$g��;g�9�݀E�:�����< Cj=� ��m@���D��a>jx> �ƽ �ý:�]��u�=:w��b�ͼ�˻*�Q�6�L�!F4>4����]��s0��xk��Fd�dW3>����y9TO=*[���½dZ�<����k��=���=��>����Oh>m�=�t�=JP���6����_�c �>�ֽ ��<�����=Hk�=6o�=���=��<��ټ�m>y�V=��Ľ���;c1��T>�q��@V��U%�=0� �'���"[��� �7o�>^��>`G�=g�:���= ���-�V�Ļ��̨�=n��>Ǥd;A}�t ���=m��3�e��x>�SA�>{�=L47>��0>�â���'�E���� <J��^9,=�ɑ� ( ���.> \ƽז+�aJֽK��=z`�=s>���=S4�=�;ƾ�J���D>~��F:0>���=��m��%=�/�=hf��s/]=$�>+�G�b��>�U�^>�p\=SL> }�=~���S��=w�s`����i=Q(*>�lj;��B�*ټ� X=��.�]���>�ƕ>L� �&��NX=���=��B>��E<��{��0罛��<�!6�|ԟ�U7���ɻ�ٞ:2���5ռ܎����<�>:�(�3xF�E�;ҭ�6X��~e>Vd�� vN=���=>�Y=ߨ���*�����=��l>P����T>q�a=�|��Vݶ�����[�>�I�=翙=a� �S�=�*�={�@;o�����\=�/}< ����w>c>fk�����=g��=���=�=� 9�~<�2\x=�=+�� �<�7>rQ> ��=��/�%���4���L{=cX}=�>�<_V�SX�W�+=3 =� �L���>���cw��?*>��=����=U"=�����*�=]w�������ͽwv=g�4����r �5� �"ť=ě��G�=ΨH�q�> �սC*=#�V=ԙ���6�2�z�v�=��ǽ|�9��P6�7��=OƉ=1�K=��,>L� ;�ή�z��=��=D'�<�� ����OP�л�������v
�-��=]���=�P�L���`��<���=+C=��=��;���P�™7��I�����<籴�= 4W�-@i=�t�b���h =����N|<�Z߼�= ?�6����UP=/3<x듽�կ;�6k�4F=��<ܙ>v���Ǿ�=�=޾�<�GT>���>�G��h�G=y��=jj&==N�>�?��9mؼ"�8=�z>�WY=�3<��Z=Lm ��-�f�O=���x;U�bl)>�#H���h�^�;�'��z$>1���h��k��j�����(σ��$M����0Mu���7>h>��r��� ��~>�u��1���_�=e1�<ڕ>�<��}i5=X~=�ߝ=��@>�4=��=��S���G������䙼��M=Og>s��<AM�<�7�` >�7ѽ�����;�%0�� ���� >z*>T�>�g��ě<d���
������=VW<>����sZ�x�Z<,X>=~�Ž�y>�pO���Q=���������ֽWy�=|oS�M-q��3�=�>�7s����<J� >F5���=���<z˞=溻�^��=��=�K�>��Ѽ���{���w�>��=���='�=�B���">I`I����>���=q<�����[཮�Խ�!q����=� F��ݘ���>�n½���=
�a���ѽ�Q�=bH=�U칽���;:S�=7#���隽� �: ,�� �,=%o=�O~=eH=��{��c�<+����A>���=�(>����lʽ�$-���>V����%�J�<܃�GP����;�X=Ր�=b�&�%�<��<Q&��[K�.=Q�
��!<;��Q��_������pn��܈N=!���Gq�;�� =�Hv=���=$�x=YQ!>�� =�s>4��=�l�=`=�ŽL�
�<P�<��ǽ�[˽]�Ӽt =S��J�>��<��>r|=a�;)3"�+�P��au��ώ<�s >!>�`� ��=�����;,��?}=���=F��<��8>� ݽ�K���<�v[>�7߼j�1<ik>���t>M��=����G@���L�/Ix=@�-�:]]�LGԺ��g��>�h��8�;��3��U="��·Ǽ�� ���f��j<ͣ,>��=�S�=�J=�Ϗ�Pz�6A>��=}��<2
!��>�O��:���Q�<�];���=�'���-�8�K> ���V<��)>(j�=�_�=)��^�h=
wJ<}�ݼP����=���=]��qE#���}�ѫ�=H*>p߀>�(���}v� =�(�<��7���<=B�D=���=Z"��A=񘐽^�;��D�b� �����V�=��@�e�T=\�3<kO)=���t��h�<�g��=�;�Z�&;����CD����=�_B�Eߴ�ƨX��0,>Y���[��Ea>��>Jb��ٍ=� ǽQ
U=%���F�����J
>�� >xPw��2׽��f>��=@�T��b�<О�=w �=�eF>LF�=򁼽���<������_<) �=�.�=n��==��=9C�=��J��`7�tT�=Μ5=�\r��uS=E�B<$�=���=Tӗ���X>������!=3x����+;�>�=W��4T���=��=�Cu���T>���R<��OZ=D~���
�rzo=(�=W'��! {=T;01Z�'�=�T�����H=���%>S^/=�UU��L>*I���ѽ��>�(��a�=>���<�L,���=���<��e>�񽽥�޽4� �Q:�=@*��[� =99=����н{�����*�Ͻ���=c�J���:<�9<��:�p��=��ɽ�S=��q�����Z���$;�x��=)�@>t�=�����N�6H��a��^��ȑ���(a�L]>�(=A��=v̉�c���D�=�
�s�Y��(�K�3>��e=�4��ؤ���GZ�t6�ς'>�h>(h�= ]�ّF<��=<ݼ=�M)>�����d>B��������fu����=���x- >�Jo��6ҽh�
=�>i�����G=��ϿC>��<(��� ��<jgp�9F=��0���&<5�<�w1=���=m��ɕ=t�ǽ_���F�8>�=��n<]�U� x��{�;��!�ݺ.=�g=It5�/�:cIʽ�$�;/<��C>�Vݽ m=�:<�0����i��=?�,�s��;��>e5�;�R�=�>2w�=��D<���=RȮ�."�=�"�;�*�=.с���<)mv= B=I*�5^D<��:��s�=��>Ǹe=z�<��=w�o��x�=��ּ��,��=�=λg�)���i��&�<��3>H���x`���+�: T��)�=��W<���)��=-t<d��=w@����<�6��`���L�<ᳬ=>�ڼ�U,=�l��a�A>mO����>��h=]�>0��L��;��^>�"�<�ğ=�27�1C<�|��q<Ҏ�=T��=�O > �����Z<����<�B�����1m�="��=�OؽL <���;vbT=-{y��X��8a���=U`=+���?�����:ؒ�>�4>�K�u�}=썎�� �={�=�,��L��f�ý�S��(c�<u8�� �� &���< � >��=+��=7����=�hȺF�O>V"z>��Y= D'>d��=������$>���=��:�/"��<�k=��4�>q����G->�=O=�6{��y �ʠ��w�.�5�<ר=����>x�=��g���>=r�����N>��i>�j"=�wǽ��=�}�=�gn=�B>���:�A'�U]8��= <��{��� >T4�i �5�~=^ ��g�G>�t�;�����?���q��Pl��>d!�<*�=K�ݼ���&��f�=��^�wv%>Lg>� s=ǝZ<�X��l��(�<;k���O=꥽�qI�;9�<��{�(�n=�i�sx�=&��<[�>�k��XS�=����:>[�;=-��=��=b#ٽ�� >�8̽�"X��ڒ>�g�@�>�]���,���]>`U��
�b��X3�|����=�;��f�2�n �=��;�J�
=���>�F{=�<h�B�ټ�$W���V��=ڏ!�� >���>�QI�� ��N>�]X��5>Qd�>�o��7��<��=�]p�J�Y>��=�C(>�� �s�p>�@�<:%>'5m��!��)�I�r�x����=�F>Ib#� �O>$��=�XܽO=�=��� ����g{<M��
��@1~��U5�_��<�q[�/����EK> �=�>>�h��PI'>�g8�}Ś�J{���C=�먾�@O��u�=�k�=��+>w�e�FuJ>�����
>m�C=��d=��b>�G��1~>��Q>z�/>�������;x�`�2�p����Op�<�����a6���=��D>)�f�.�%�A]��$>(�=2���*]�$��ż�=������X�SX;� ����a>���=�O~���K�c��<�
d�Ro����4���.���>���=f.ɽ6�K�o-C�ԲC>���=@ͽ�ר=B��<��`�����j�꽿9ֽ�@���=iz�=�G�=ݡ�>@߽�Ȧ�>2>Q��=<K���J�<% c���>�&�=�X>[�=T�=O��=7�=��D>8]F>)!�=,vB��o��;��=�۽�=�T�=�e�� `�E�)�s��×=�ow���=_�>���<P�Ļ����Q�=���۪�vY="^߽�������;I�J�=>� p�ҞC�q�p=8/�<G�"=�̻=s*>c �=~�#=�+�>ŠZ�q#V>�g=l*��tB����>m��=�!s��|���Rѽ@�^��ٽ���=F�J=��U=j�ʽ-�����5�Ȼ�7�<λ�(]>z_���F� T>S�˻�6�R0�=]�:���G;Nǘ<��n��>Ƽ()I�ذ��)O��}��<Xg��������=�Q����Ǽ}�<���=��+����*N�=8�ٽkA��Cv=�����/(���=���=彶����<:���>��&M�=�V=/�=��8=^��=sO�ƲV=��½�n��б9�w�-���������79�Ub��Vi�=� '�qiؼ���<
�̽�Ģ���D��] =S)���q�<?ᠽSlm��D����>�Y(�P��<y�=z�>0u=�o��"Püj�m=�ݝ����Y|>�Iݺ�4�=o��=�M�<3|�;s��=�!��ָ=�(H�X�>rÅ���4�#�2= '>��;��=�D �J�h=UoϽ�����V>�r,�A�{�xIJ���������~A��.�=��^��Y�<��Z>6�M=�b(�9�=�bu�Y;���Op=��<�m�=� <��.=N��<j��Vœ���l;<=���< �I=d؏=�=�=������>�2����d� � =���=� h���K�?��=0fp=��ܽ��齍��=d� ��s;�B;C>ź>C����_j�yi⽣r�<>�=���<"m�;+�:�Z��</��#҂<����J%>*�=�I�<h~��S<볼�"�<�0>D��;~<pr5=�M~��@�<I��.��=6 }>EX�=�0�=�[E>�����?H=s�v=jЖ���#�G��=1N�6��=��<Ό�>�y"�ih����=ŧ�> o=�� ���F��Lr=�U��I�k=��w��:��)�����21�<�$=,1�[=%l.=g�E��w>?Г>v��=8&���+(>v�����Ӯj�� ���ﻛ�>j�_>�tV�@� ���v ���X=��5<F��=1���.���<�<��,x����sG1=S���@&�=�}c�J���Q> �e��;�=�9C��g�=���"�>����b���t&>YHl���b���O�;D�3O=a�>>Qp���H�=]d>�=C��f罏�Ҽ�ϫ</�!=�m�بٽ��\�����'Y����������;�e<=�]H>^7��G洼��W�ŵ�Q�<�M����=f%=�!�=)�M�߷���G��\>�۳<�ԇ>�)�<���=����5�������*���>
$>�v���=���k0��a�>[Ѫ<��k�s�>R����9���gb=z�4�PS�<�u��׾���c�� Eq���+=�}��8�>�� ���>�L�=���=׌8<Ry]=��>3��w09��y����<�����’=��=H�W�����P�)>Q�����X<�Ŕ�U��=�V�<�*>TV?=F�c�O�P��σ��Ci����瞛�)��n���S����K>/�����_=/T�=.)<�����=:�ýW���~ȴ=Z��=���=��Z=J��=���So�=���}>9|��WN=G�>���=�$�I8���Q)>n{u=�h�8I=���=);lL{�vׇ>�&8>�ﵼg��⏿�q�<�}-�=� �9\���=�-K��������4u���xϽS}>$��>�I?�Z��>�����rm>o����૽<S�߷=0�>a�:�$�=�6��������è,�t�>�ڜ<:�V=�H�>�A3�q��>'�=�8�=���;&��>���<���=[{c>�>?�;�X[)>h����l>��'>�����z�<�O���g�
U
dense/kernel/readIdentity dense/kernel*
T0*
_class
loc:@dense/kernel
�
dense/biasConst*
dtype0*�
value�B�@"��N��@�<���< �y<B��<k���W�<PEH���;�}'=����
���&=P��<��-����<<! ��\4��"L=��9�һP=¼���<����8�c��\��_��q<�]��m�W��6�;H��J�����o�:��ĺ缌����9{�C͈��M0����;+:���"ż�.�:����<�#��������*���� g��Bk����X��o��D�f<F<��#����;p�5=�+�< M���c�<���8?j��
O
dense/bias/readIdentity
dense/bias*
T0*
_class
loc:@dense/bias
_
dense/MatMulMatMulstatedense/kernel/read*
transpose_a(*
transpose_b(*
T0
W
dense/BiasAddBiasAdd dense/MatMuldense/bias/read*
T0*
data_formatNHWC
*
dense/TanhTanh dense/BiasAdd*
T0
ǀ
dense_1/kernelConst*
dtype0*��
value��B��@@"��Aqؽ���=��T�H>��="�ν���6�Q�o2��^�1������޼O��X8z>�c�=��ѽS�D>�(� G>�:ս������<�Ļ���<_S����z>]R+�YN����4�-�=� >�>X��>�?�#�����S� x>5Ս��}��9 =c]?�%0���=:,���=��?>���=�ˎ=� >-�F���%>f#�=�08>}�S>� �<d}=8a@��h�>n
>F/ �۩T=�,��`��{��>�\5��^����>�>>��D>B�e=]�P>�
�=&1<D@~���=�i��GZl�P�
<ۊ�=����H
�w;�>APG>��W:,h���˽=�5>
&6��1��*����<O�L�Bs;��:J�2>��ؼ3AC=|_���[�CC����>�����<B���>�Φ>�e��~OD��� >�-=9B�=�#��7'�;���=���<"���9�����=/�P>
�>]�1>�]��R�f>��н/�P>8�8>F����bo>���=��=����ѻ�����>�v�<����+�������y���7=����B~m�Ӑ�>頗��">�\���Q=� �= e�>7B >#���/�b>_�J>��3>��=Ÿ��q؏���W�E����X���;ݼ�4Q<i�S�~�J>xV�;�@��\X���O�݂_�^�K���6�s���������=C�%�-4�<�s>A���`��=ǃ���f�=�Q����=���h|弩�&���ֽ�<e>y� �~��>ۂ���d'�����]O��&����[� N�=0M� �|=���=k���A��o��=���>n��<~�&>�A1��o(>���� =�ۅ=�~b�Kz>�
'��)=�S�ާ��������=��>���M���}>� &�[�>�,�=�i�>욳>���;�?��{�N>u;�>�(&>�����}>�;�6���X>`�b�ې>ӫd>���p��Я̽���<W??=o����`���0=������=z|m=e[�;�.�=�[�>��=��{;�i%���=�X+�M�n=aӼ��h>�^�SN,<M�=\���
@�=��<�zK=��5>X�n>��?���=A�_>�7@��=3[.<��k>��s�6�=]��=&hֽ��
><��=uܽUY�����=��>��v�B��=i_�=��D�����zYu��T�=� ��⪾մ�8Pp>���>���oq�>���=wr�=��_=G��<_aS>7@>��>b�i=fr�=�N����,=�eW����=f"�==��<�!=�>�T��$���=��P��^>>��>��/��1>Ք�<U��Om�=���~]�DV�=� ^�`P$�:�q>���=]yl>��a�qS�=��M=�J~�_q���9�=<4����ٽ��<���<�>�SG�"$�=h�����P.���%n� �&�K�Y���/���<�݊��ݛ�Ǐ�G�<��*�=_1��� ��MF����=��<J J=�D:���Z=�@<�k�D>O��=�b>�Q/>T�����>,,��ix(>p�����5���e����=\�d>�*�=�M=���=�
=w~��ry>Ј��ͭ<q��>`U�2E+�/IǼ���=��U>f��`RC�� )�z�7=�䏽�o��c��g;�͙�o^��h�t�2�9��� >T�ۼ�͆������b>�D�F�༥'6>��t�cɖ���8> QJ���X��m����==�;�Y=�ڽ>��U>:����W��f`�=ƒ��D�=qq�=��;b<��� 9���
<��*�0�ӻ�>�G>��л cO�%�5>�/&�����������=;��X>�������nQ`>�k�=r�[���;)�+��a�=����V=�>8 =Y�"�d n>X�齇�V��@��:�=48>�s�>�&����� z�<��S�O����Ql������z�<�ݝ�!��=�i�26>ݟ��2�ʽ�* �1L(=6h��.q��b��0�=ꪜ���m>�bp��o��Wk����=ɦa� }���;��w">5D=�Q"=����Sd�h>��G��Vo>�ɾ���<�i�=���9φ������)��]E=����c�N=��;h�= #v>����>~t��A��T�V���ǽ�@�k�½������2;�f=�"#��]>Q��X���|^�F��2Mֽ@�e�Že ��qK��c&$��?�=,Ľ� .�邘���U=X�Q=�RE�K�2�aw̽�<=~~=���>T�G�8��>}>�'T�rD�=]� >W����7d���#��h޽���I' ��ۋ�1�2bh>�^�����;��w>W�l�-�ͽ|W1� ���%C�T�R�#��>�b�=�����`�<��`=��z�1��h��=�)˽�𿺻��>�-t==䄾��=�P�|�g��/�/T���z >R�x>!0s��)�;���=:)�=��
=���<ΡP���>�S>����ֆ�=玟>�|�=�^�>�ݽ���=�B�=�8����=za=��<�6>�j��\���=��>�g�=��<��l;��8>:<���=�=���=l����,�?R>�Oh>�錽� �=Fh�<%�+��7�;��>@�=9(=��:u~=<%��tc�>�D�=J)��|�=�&|:�.=m�^�M?���g�Ƅ����=#�/=y�M<��y<������ �ᘁ�j(��7�m>�����Я=j���k��:]�:>q���+:> :�=������>�:�=_Y���5��_f>��9��h�=Pz=�͵>(d�=0*���׮<�%;pMf�0]���<Ľ���i�>E��>!i<�D�=�=/�O{W> Z8>'��>��>�=��v�=ŚB��v=='�==�>���=�<��L&}��O�=䄆>'"[�0���ot�ZXM���� vg��J���� �QE >P�a����;4&�:��� ^w>s�> ؓ���=^J���A��>N=y?X���q��ܖ>���>���=�-�<2�M<}��=7�=��=�|ƽJ�o>��6>Q�ཹK"=�4>�|�=
��>Mk����>�=�ަ�o���ő�>��w�6�x�z�h��9��M �� B>��:�n��4�<N�o>7$�b[5���N�cn����f>�>D��=.ͽ��<=��d��}f>|s >l�b>����,��1=�J>A
G�����߄Y���= ����=>&6>�ρ<��� �;��/=�z�=�
�=
����w}�Hj�PF��,�,��M��P+�No��Di�����(���"��H����ҽd�T>]�=ٱ[>�7N��y=��>�s�=�[3>0!<�� >-��>Sw�'"콰�
>)���yb�=�ʧ=�Ij>��=F���*�$����=0 �<� >�:���=h�%�*\I>P��>�j>`7�'��8�=�L�=H>go���k���:�ts:>T��5�=e�9��]>�����F��>��Ƣ��S=G�޽$�x> �����b�!C��К���LE�BN�Q (�ҵ���֟>�F�Dx�=���<�ab�^|�@^ڽk��=��N>m�X=���>���DZE���h>GY*�$^Ǻ���� �����r�W;'�@;�>>��.>�����c��>z� >�,>[
7�
�>�2㽓~Խ�[�>�B����=>��>�.(>��c�񤙾�&��ޙA�VG�=}�=" J�hę��>���7��=F� ���J�pŏ�M��l��V̈>[ws<~�,>mzc��;}Ϟ=z��<A궼�[V�,�)>$*[������G!>�-g��P1�ߒ>�.F��D����c�xǬ���������,>�>$ �;����>�j�=l���K�b~������*>�2����y�O;��==�ֽ�p��~�>�;#��3E=�@��f�<
$P>�֏>Z�F��������k<>ι:};���9(<Y->�\�=݌��;�[>w_>-��=�+>�J���O�=��7<��S����͸=rz�*]ֽ�ۇ='C�w�<��|>��>��P�Gb�=��>$1:��H�^�3��T�>J��=��Y<A�b>.^5>p.=_>��a<*� =J�>h�h��K�����<���1K�Sp/��) �d�>
�]>�;>��e>��Q>iGy<,��]� > �y=� &�?T>���=���=yu ��Q����=N#S>m!>Û�<V3���Vҽ!�j�d�
=&�s��� ������YؽC?n>?�>,=w��<� ��WQ=� �����V�e��%=�����
�no�<���bc�<��>�s�=�j�<X�a=C<�=�<>��?��mn���f�N�=��]>��5=3E��T�7�2Q�=5���0���Z=�����t̽���=U��g�u=�Si>H�W>"c>�c󜾿,���hu�%tL<��v��hf���4>]�P>#�-=����� > �=c���M,����V����=sM&���M�� �6���eL���=���=��X>U?��ၣ=-A;>�9��X�=�c >(w�;(��=�#^���<���>у�����=��>����y9 �YD���J��@<ܔ>*8�=J8��+��=� �>�I��D�>}A�=��m�4�#>.Z�=�I�=�'>�.�<; ��r2!= ��>��<"���jC��~���!���e>�#�,�B����>���:ߗ>�����u8>�B���$�>���>�h��a�O�48=��>�[+=D�>��
�<2>�)�%�L�ƅ��n��"�=c��>5��=5Zi��,����,><EH�zkE>K#Ž(��`Y�:�ƛ�Z
>��<�^��ڊ=���<8��=E�F�墐>&�ܾ�]��N��
W��N<>vM�H���D�>��)=u:����߽F!��C��=!m��<�^>wG>�5>�����=��������Y��D#>J@�=d���12=�f>�
<��1��sa��f[����*��U{=&�U>�Mf�'ώ�XgF�W9�=> ���H��<������a�aM|>���=$󅼹�>�|�=�!��v��=����}>?;e����=�Խ6�=�_׽��~�X�<�1=��l�<3>x���Z��>���^'*>�8|>]�˽ڷ4>�Q=PWl�B/ݽ�z9>v�N�7���e-�<��<�D��O�����d��W�>��=�'����Ͻu-��de�;I�>}z�>�&>��&=-d7�����N��&�R=mq�=��.>���=��L>D W>�@A=iE��b��^�X>Sx��Y>�u+>tk<sn=>�?�=�8�=_�G>l���01�����r��=TC4>T~U>f7�<�F>7�U=o�f�`�=<1i��C��}�������^�`>b$�=� I>*��=5`>1~=�҇>���=�QȽL���n�A�=��H>�f�>����y=�N=D+�=�7��`��=ȃE>�S����= >jX��h�ǽOmf�x2=��὞^�>���[����'�~�[��Nv=��%�Sǽ$dE=p<>��p<�U
>�=ʽ>�g�躄>��8��
>�; �>A��_�|�D�<H�*�� ����O=���/������<b�`=
���QxZ��L@�=�F���Y�GG����#� F�<4�C�L(=�o_=;��=�Dr>�+?��? �NY�����Z�彏G�=�$S�����5���d0#>��1�.�y���.=����} �=��>^���#�=Z ��Y���Z>����'e=1��:,�$>&T|:$�@���ӼE��;��=(�4�j��<J�O=��
��m�<�ح�Q*>t��>�)@>�a����<��a����=Ui��Q��@ټ��=� %�Q���X��>e������E�C���>���>��>��Y>a�=Ŵ�=��ӽd�Q<S����S0�^=���;X�4<7��+dɽ�Y �t�=��=BW��Jҽ��>����>[��<G�N�e2=�t(>�^8��LA�*&�<���7�>�����j���f�>�E�55&��S��X.>���=w>�r5��v��˵�$j�>���Q+>�>�`�5�mu$=�l�>�W;� �"���=�Ɍ>DU�=>�W����=�gz<�u�=ȏ�>�RY��E�8 �>b�W>D�2:�֟����={�^>�Ap��9�>)L*�+ٯ�c�f=�L۽�d�=v�����>>b#>�
�=�(=�n�>�㽌u�����=���g�ּ��H�� =��:>_�����}=>�ͽ��"�)��=JSb=���<���>��S=� >��=�h2=��j��Gx> �>�g����=t‰=�0�=�u>
#��,�C>��e�/�O�X2S��t�=D�]�V�B�C(T�By=*������<�<}�,<$7��\�½��ټ��U�'Z��`�=��Ƚ�Ӱ=�P��)�oyR>y�=���=v�=O�u�H��u��=���6�e=��0�J>�ے�N&��٧�|Y��ͳ��%6�����>l��������>���<����bн%�\=_��;�I.>���=�/>OV�.��d>�}d>1�>�����YZ=�5=6�!��{A=�h =��=�U�=�򯽴���,���)����,�ݽ���<��H�:�9>kr�=r��=p�ٽm�>&�?����Cv�=-H�<SM�<��Z�F����1�>Z�?>}��=2���,�=��`= ����5̽>I;��V�;JL>�LB�%Ι>`����ʼ�dn��4/>]��!�<ʳ�>;">7Um�����]����>.�n���=߂o>��%>�����A�4v�<h��=| /��m���!Q>}�u>�ړ���a�3�?=����*:6><�/>��@>�y;�b��=��:����=ǹ�=� [=�|>?�U��a >@�<��� � =��;>O�B�(�g>��= ��j_<�O;� �x=R8]<����oS��Db���d��E-�эy>X���NO�X� >9�=�@5=�;��k<���-=j�a���V;�h��^�=�r�< A4����=b����gA�o<��u�H����>�X����>e��=�+>��A�����=ӓ*=�R�=���='���wŤ�/���n�=�L�;i�ܼ���=?,+�[��$����
������5����ǛP���9=Sٚ��b����=7��e]���(�6�[=냼�Ϭ�< ��<X�>��ļ��?>��������=u�=f&"���;d湾v�<F��d��>�<�h>\ٔ���=��>�>2_>w�>�\���� �eX5�����e�a��:�;� �=\f���U�z�K�tkh��G/��j�=A;�=���;�49���]��8'>!.>��z�><�d�R#>Za�<2�;�!-�<����TgQ:���<H!���=�r�=����=6��=��x�l k���X�F���}��=�(м���r�=6���7l=Sp��g2�g�A=��w��ƽ�6�=�P>��z�A>�o�>-0��3y��œ,>���<խ=��=�d����Y�j׀�gE½�X=�=Ю�=����
=X�o��Ue>����{a�,���P;�#C>�J>�e����ͽ���>��=��i=j(�=;i>r楽P��>X��>��Z�$����8���=H��������U>�6.>Z�Ľ@�j>��u>�a����P>�! ����=-z�=?�{�^��"�����n=����-�=>� ��� =zj���Nļ!�H��֘��}>�4�;�%=��J<�s=r(���UL>:��I{I�5�@>��A<Xx>��=�c=��>H�<��>l�P<�^�=�/�;r�1=fz<���D�����%=�_���\�8��=��ݽ��k<!��=�ck=lE�>}���Bi/>�v~��Ƚ�[���0>hӚ>*����<\�,="�н5j��*��>�0=��S��2O�Bh���<}�U��=Z!��(�|]=T�W;�G>��P�w���g�~��2���]p=���<���= ��; �1�c���aE��H>�d�=Gڍ�O�>~�\>�_%>tq >wC|���0>��=V��=M�q>�zy>�&��G�[��=��ۼE���ƀ��7L=�fY>�t0�7�/�=�?>BΔ><�>ϫ��mu�=7��=�7>g�=������>����b�>��V�-쇽���>�ߙ��>��<�V��>�лrq�=��n��Ӗ>-g��.>B �?��=<�����>��ɽ��_=��2>�j>����ٌ�>�4�:�Ɓ��&>8L>�h �?Q�=^����s�pG*>���ԣ�*���R�� �=uc>j�6>�8��^��=��ٻ�� > ���<��<K��>�ؠ�L��=��>��>|"&�%6���+�>Us<��&�����i�P=�p����7>���Js�=ct>��>�T�=�9�;�W"�*��>�����=��x�4&�� �����Q������=M�����W=�޾wN�*��>x~����(>��>ت���:V>�u�=]���l.>�O7=�QH>�KE=�ً�}���N���4��(42>N�˽�!�=�����N���>R1����6>��x�N�0>�C�=C�=p�U<�]2�]�����=`c�=Fނ�� ͽ��T���S<�*=�Б>(ڽ��9�5]~>�n�=����>�"Y>��ý����?V�=
�U<�ޮ=馍=�'�=!�=�\�(���u���s�<�쀻�>��=����cK� s�>OGt>�;�:6�*�=�����ȸ��Ǜ�J:�<�<ښ�'�C>� �=���=���� �=�(�>&
>[��!���?��q�L>������=��z���.�������>���>�J�=#�A�ˉX��O*�˛ >~M��R�u��sB>���2��=`�=��O=�&1>�iX�:aW���>�QE=Ũ=3�༥���;Ƚ ʅ=[Ѻ=(^��$�K=mĂ=��<�:=�����C�=��T=�Y�;�>��� =��,�E�'�$Ո���C>�5����>� ��("5���w>�ؽ���_>��׽��A=��r�8����,>:V������u��<1Z��)��x3�:x!׽>/ĽFO�=�����|��,w'��ګ�<�=
����ӽ�楻���=��>e9��)���/���Z&��5��ћ>�h>�_�='f<���=s��<��<>5�3�^硽IT\=
��>S��=0쎾��W����v�N>2����<>�Q>v >{0�>��E���*>�3���Q<�F���\�o�D<%r����=� �{vŽ8�� G��ˠ�=7����埽��<�3-���=� �>&�>j��]�\�K�9�
�$�ռ�h��]��� � �<�4�$Uq�� ���,��*�ob�#�2>�ֽo�>|�
>q�Y���=6ý�G���I����>>��/��OP`>�D����m>��3>��j�=�c�;8h�=ٗ��(T��S�=3y����H����o>��<��� �����I�UM��J�=a�F�g�� U׼��9>h��=2�%�=���=*�<� �;B�;ǩ�=�=甽,a@�,j%>*����m�0��>��;T<�d=/��d ��������9�V=�f�=+�o�W�>���=%̘=9X>��=�l���f>��F�o<Q�;�xT��,�=HA>�ӽ���=�_>G��{8��]8��߿���+=� >��v>��J����=����rΜ=�E�=}��>�S�>Oc��PQ=r>�b���LE��#����4��d@>�)뻽���9�=��3>��ʽ���<˧+>��=��=�`>+81��R��@a���k�=���=�j�����ݽ�V���ʉ=F?�>��<�>Gc���׫<Xs�=.��=���>�o>���<�XK�����aN>��+��h�>V:��� �>H�>䶲����<�)$���N>)�C>PbF;� <.�:MͰ=���s����Ž���<y��=79>c�f=��D>�,=�S���\���)�������ݾ���&�>��i> �>�?�<��H>xDJ>�o2��u{�-������>�rI>;�5����=�9�����<M򋾌���"D��S&>��Z�zua>P �&?Q>�R�>��=b�>�<��7ݷ<�����0�6�*>�n$����>s^4��
�=ڄi=;�=.�>�`�=�ܽ�>�>U�ܽmp�<�0����"��Np>��¼9�>��6��>=��=�\�>��=�7=��T�ѽA:�>Y[�=5���|h�>Q��=�(�>K9r<�q!��a'�S�<�v����>���=��1��;X�����<�U��=�z�􅆻���=��m���S���R�!Jj���꽘>�7�-Ͻ�'8�禽�|�=��f��w�v�m=qB >��r=N��=��
=�R=-���
�=�">��_�J23>|U)>�������@���>�1�>FZ:=�6|:ʨ>���=Y��<�a�"ٲ����=��>�C黯�P����<?��>��i�/��� �=>Pw�=�[���3�;F� >B�<�-`>��R�p��=[�Ž��[>$ۣ�>F����V��8�����<�0�DA=�<�
x����=��@����~��@��u=�G���/���Qt<'�= �">���8�d>:�����=Ē���>\�8�����0�����9�?*@��K/>�\�S1�=��ս�e���� >�k�=�1>��M�����M��=>�6>\"��GN=dS�b4�@>#�7�'ͧ>�5:���<[�F�6�E>�X���н��=����[R�=Luw�-eX����I9�{B��%r>v��<���},i����=�@>mf=x��%�[�� �Żɼ{0���=x��=Lh&���3>YӞ��A'��l2���:�B+�l�=��Q�ab�>�H=v��>i����&���n�-�q�?�K~s�{��=W=&�Q����������}���>�h��6A�����=t�F>F�.>���=�2O�ᏺ�@��<�>A>;pP���I���]���c���н�r=�4x��=����V�������~�=< �"=kJὉf�>N��-��*w��KG�P��=���=�@�V>�tY��[m=��">��*��؆=t/��צU>k��;C��=E-9=�������` �J�����1���9>:>#=d�@>e�m>+A>Ul�>�6��_ �,5p�|x>g�h<?�ウ��=���?��+6�Pz�����sZO�,��>�'�=�z�<���=��= ds���^�*-<�W�ܽyȊ><���� �S$=�F޽��|�0ޕ�>-��=Ql������x꘽��(�S�=��u��c���}�]}�>W>��<�la�>J�ۼ<���۽�{l��[D�Z��<�Z>D�Y><��>�5h>�(�>� >.�->r��=.��=qc
>�D�=~3q>�K>i�_=�� ���=�Ǡ<E�Z���< 7�=��= pc���Ҽb�*� > >�=�|>���RՎ��c����/�U8�M>7=Jq�<��5=�Ӹ��2����=<�9>_���-=E�#��T����Z>"�@�y9��x�ŽG�)>)ù�b"�<���<�3>I��=�#w�͂n>�j�<i�w<S��:˦j��B"�1c�=ݺ >�X>��?��]<�ie�=|Ə�vN�͢=�os����<�/þ^lN=��)�m.>�M�B�
=�~�=�(
>NAJ>�����6���*=~�����6=�>h���>��H��拽(F>�ǡ�T>�=�#�RQ�>����d8�<<t�=�Ղ��)6���>�͡=j��<.Ax>�����M� 臾�+���T��_A;�_�`�>=��۽n��<Ѽ�=<,(��sg< ����=ۏ�8.�,��;�Hľ�薼g/���������G��1Zm>���>N���&��=E񐾢!+��Tb>��>����/�,�,��=�Y}>R6D��u)>:�=���<NJ�=\����Q>�"�<ώ�=ā��C+��2(=/��>�!��U���|>+� =�=4��Aͼ�h
�8x#<�e*���>�c�B��_��'�>%����8�=T���3n�=5��=����㌟=�4�O"B����i >>˝�!xL>���<r����苾 �=ύK��"g=��=[���k���g �W\ۼ��˺H�6�~y�=bPq>��=�;��ʫ=�4>�h�
d��X�\P�=��</0>�vT>1�0���d=�� ����c6�=�=7�>�8>�mԼ�B>� �=oC�b��`1>�wA>��L�%�g��<�=��;V��< m�
�;S���mݻN�6>�P�>K���6�>��]>�R>>�v㽥į��=�D���м�%�c���>���:�` >3E>إ�=̻s�=\�=r�->J�'�se�=aFK�x =�%���9�>�����#I�e��=��Ǽ*������<x�#��� �>�߫=a�#���>�?=����](��z�\�;G�;kEQ��"v������0����O�u�`�&6l�� þ́���0;�ɽY^�<�'E>p[y>1(>�Lm��Yƽ�=� :=� ���8>�5k�
�>�^�
ͨ��'�=�,�=>�ui��v��V׌�͘_=��+���n�L폾�ca>l��>�=�J����{�=��ѽ�)>���V�2�if�=O�v����=����=�T87}k�/��<
�=�N�=S=�޴��=<�ڽ��=�&��5�=i��0��,獾5��=��H>�ԧ�V����-�k�G=Uo�=�/��`�a>�0S���i�(�=�� ����>i��>*U�=3 �<rx>����t����=��׽��N����=�1�=��f�-)>��~>�&���b >�Z��S�]����w��=O���I���w�k<#c�6>u�W .���"��1f��8�=kt;�c"�A��:�>>H� =��>��z�<>6�X��k�>��8>)% ��>�k�=��ɽ����4x=�i>��I<�9ν�Z'�qم�8�@�,#ܼ�p����v�Fj�һ�� �%�o���r�X=&X�ُ=K����U1���]�b�`��=OVO��ZI=�.��O0�>�;�=\�v> �E�t:�=�v�&30�;8 ���L�Б�>�A�=���>�ý�c�<垒�P&��xC��C>xp�=L"�:at�<�����=�1���Hr���;a�� ���@ἄ:P�W@=��9�we�<��I>�?��~�W�����%=
>��4;���w��H#=�_L=�����Y�U���=�Nt<�#}��>h+�=��z�~�>�_�������/�*�<�Yn�’/�㐋� UL>�"%�N�z>�!#���ɽ�*��w���Y�z=��t>P�׾� D��]�>I��V��=/=�<`풾*K�=eV*>���=x��>��>c>�YZ=��O��:I���JKQ�~�I�h��D,I=��$����=��j���>>r);Y�+�ÿy�:o=�-�Ġ������s� ��<�5=�d�=������<wn�� �=��Ͻm�E�+�<>��7>t2 �5���|d�t`����q�>���"> � �Z��N�%T���׽�h�=���� �-�j��=\�>⬼�� =�;Լ &�>���H@>=׀�%�k>��z�{�۽܅,�l���Θ���<���=��=Y,ѽ����PM>����W� >�Y�>��/>8�=� >(��=� =z��=K� =?K�<#��W�܉�:�������_ =�UԽ!��>3>�<�ɼ��h�b�7<�4�Z��=�j��J��>ȴ8>��8>HS>>�:/>6���n�>��۽SO�<
է��F>�(����=�_��a}�k���=�=�ͼ�i�����;ԭ����������=�,��]];��P��0�>�[�<ᛰ=�%8���M>�i>� >�u�= h��O|޼���>2=g�^e�=iE��D�;+����R=��H��E�=�Q�w��W c�k���G���DN�����=ǃ��z��j ���>�鵽����@���xk>��J���>�dͽ�H8��;K=xȽ_+^��������m2���L׽���O>���=� ��u�=D?�>46_��-=�Jt���Q��i�=���\&��ӆ�� �=e
�K��3%�
ϙ>-9�=��,>��K>��1>�a彡���ý��c��0�X�X�(S���>h�!�|�V����=�h�;<$U�mv��SӚ�G�=Y�A�ek<�`ǽ\�.�o��<�E༕��>��=��W�]��=�Г��l��d�q<k��=��[�V�0�ቀ>ݗ�L�=?��=�‡=C >�\�=[U�pw�>�+��e��� >8=>�Og��@���2>�nν{3>1�^>O���"���y>>�����|�����<0�����>���>�>�k�=�m��K`�€�=��9� �R��L=94�2~ʽA/�=O��� ��>�I���D��Y�=c�>��k>\���|=��L�l�/>6Ա=Ҋ�=J���� Q�ƻ���C�=-kr�Yo�=�=8��}Ľ-g\=>����ѽ����Mš<�|���.��X81��8�>�&��9q>,��=��a���>�����(=�w�S��=�hO�8�]:0Y>��=����5�ǽ`��=y� >���<0K�=�&��!����oʍ��~��A����R=���X��� D߽Q��="����m>!�#�c2��4�<,����>H߽q'O���M=� �=�o�=���L��=d��zd>x������۽�`>Z��=�xK�*٥;���="��(���l��CE�=l�j�P�*���>�q�p�ٽ���<�l�<1|�<��S�}é=]�>���>�!�����:����-��wP��*Խ5��v�M>�{d�J>S>�h��O>�ռ�T�=�`�=qw�r��=2f3���`���߼�|4>c"ѽ�M�=����`&�U���=|��<�I>�@����[=�6��<{f��!">��=?����=Ƣ>9�B��zg>�s �K�n�Nq >!�!>`�=���:ZQ=�;Q>��<>KZ�>� �<���<�-��H =>g�,����xd�4��+�>�E>�^g=P!=�/_��+�ާ�=)S�<�(> �=ges>�9��v�ɽ#�9���>jlr�M�@�~}@<�-��{
<�(4���B>@�$=1.��e�(�Lv�xi5>��~;����V�>�Go>�Hn>#�V����������=���<�_>�V�>��`��=՗�< �?�T�l; ,�=���+j1>�Gq�����ȩ��\[��3�>��>٨�;CCr��'��B>B� ��->A�^>D�< V=� �=�0�m��<�� =�۝�ѩ<> c�c�����{;QH�O��=�I��ný���\�=L�O���Z���O>G(���&�=~t�ȫ>@��<'�+�b�z��z@=OBr�X̔�F*�=��w������d=l�۽���=����\"���ڽt�+=.�F>y���7�g,�=ߧ�>s� ���> =Q>�Y<��_�i�>�.�=����"�~=;�~�0��=�AH>BF9>�$W=?�7>���=}5�=H��=ƕ�����={��=#�c=�Ҙ>$; =� =�h ����'ߍ=W��=˷��y\��<�<c=xS>�U>8�=�.65>�ȋ�Y�]���ܼ��O=_߭<7[ ���<q���� @A��>5<f=��<�_e���E>L��2���P��S�+>;%�=H�-���}��Iά�Ž�>%>>��6cC=�ۼ��J�=/)ֻ.x�=���=���=�������۵!>��i��{��,��#?̽7�T>������=��3�{��<a�S�X�U>2�*\:�<�=�xPϼQ�=�gF=���=�><��;��f���3�o�=ޖ�C����s>(����&e�=� ���=�Y�F΃>%Q�=��+��H%>:��>�k>�z< ��� ��a�c�������>��=Z�\<�oQ=��9���=�!=��=�|�h==O���� A=#t�;ƛ>�K|�����}�/�^xҽS�,>ݏ->���m�K��@�=Q���ٻ}q�<�� >w R>�����%��qG�>A,��N��dK=M"�|�8�V=�>j�:���>_d'=q6=���=a�=��|>=�>$.e���/���z=ZXʽX�=>��D�����Ƃ=��4�(Œ��MY��#=����>8��k��Ul���>u�d�S/F�ޑ�;���<��
>/��=x<j>a�=�u�=��`���>` �<�O�>����am��:Q��bA�b�S=Eq���j>�}� dD����;0���=>u���%�m�;>�_F��`��Rxg�)��"�t>M�Ӽ�����&�)rX=ǭc=/�:��#����|�W>8�i>��K>�&>{�K>O_�;g�&>$�n=@"��c0��_�=�"���GĽ\���]���
[
dense_1/kernel/readIdentitydense_1/kernel*
T0*!
_class
loc:@dense_1/kernel
�
dense_1/biasConst*
dtype0*�
value�B�@"����WA�=U��Kq;�N9=�ü0�G<՚�����<�P�;x��<��E<|�B=b��<���x�8��7�?g-��
�v{�;\4���?u�D�����<ӊ@=�����@=��
�.4�;#�=p��� !=B8���a���=;�S�`g�=��;��Z��p��=b�<��t�`�
<|�Z���>�K߶<�= ��l��mF<�%����<���=Ų;%�*<h�<M�%��/=�#� �<�j��%(�&?�����A���
U
dense_1/bias/readIdentity dense_1/bias*
T0*
_class
loc:@dense_1/bias
h
dense_2/MatMulMatMul
dense/Tanhdense_1/kernel/read*
transpose_a(*
transpose_b(*
T0
]
dense_2/BiasAddBiasAdddense_2/MatMuldense_1/bias/read*
T0*
data_formatNHWC
.
dense_2/TanhTanhdense_2/BiasAdd*
T0
ǀ
dense_2/kernelConst*
dtype0*��
value��B��@@"��C� >� ;>f(P={}��=��̽�P$>�=���=/���m��=�F�=Ju��^(g��O�<�p>�&��i>�S]��ꣽ�K�=Q��>_y8��?=�54��>�'> �S�Z����d�/茶����@_���s|�M|�����Ρ�H>LrK��;d>;˩<����ܐ�=����(ڽ4=��P>��Y>8�8�O>,}��|�=l?��'�۲��̒���1����>�8���P�=��{=@�R=;M>�'=��B���D>��];L)��EFe=_�u>W��>UQ�=��>�j}�Yⴾ5� >�C�>����~��<�<5>��K>�h����@>Ġ<�H>���>�(g��H�>hs#>?yh���q<+aH�Sa >��T=��ݼ!iq>o��b>�����d���=J�r=��<����.�ý�o ��ק<���>�[�>-�9�Gc��%��΀>��K= �>�>�������2�t�-�<������>�M}<7U�;�̫>3Ui�b���>} ����>W=ڽ��^3O��於U��¿={Fe>�}J��*[��60<?�X1�=���>�l�=Ą\=>�q>G�=�͍>��S� P`�ޏz80B����!>" �Tݽ��/>�u��3M=\!�X@>ukK����s�U�Ŕ> <%�K�a="�n>�{�<�~%��߲�>9����992��XD>�_�<�彘[�����=> >=���<�B�=��6>W1=�-O>��q>~���3�>b(#>�ɽ��V>P(���<�t�=]LE�;l�>I!>��D=�p*<�k��2>I�v���zR�=o!���.:>"��>m��=`��=��p���=?���^�"=zl�=��n����=E�=A4;>� �<�$���[i����>�OϽҘD��ՙ�ic1>0R�>.��l�W:�n^>!̽S ��)�<=�������,��#�>옑=�C�>�NF� M� �>�1�=�~>�޽��P>׌�����>}�<�>4���!�*>gfg>|�Y��4">-0w�����K[=D�>�;�<3�>�G����=晔<�4>+1��&�g���>�>��ߤd>��=�!��2�=�q��<y��_9=:Nk>�l >��5>��d�0�~<?�3>Esr>#�:�ė=�|
��i½�l�<2�e�'�Zr>M��=�ŽF4��as����= B>>�ݾ���>�4+>����nTW<��K>�N���a)�a�������d�=y6̽~_�=W ŽC*�<*�����T���=S�=��S�D&ۺ�I>{v��9Y0>�:ݽ( �=�Ж=�&>62߽��b�Cd�=x‹>�CC>(䛾�O��2��;=jt=�z����>б=�<j=�VȽ�����?>�I>n�:>��b>R^=uo����=������kʜ�f� =��=�>>�;�>�.1������=q��p�<>�
���K�=O�F>���Z��<Pf�>�j�<�:���R���>e:9�3P9>��u�e$�=�t>Q��> /��hm���V>#T�=�@���c�>�F�e���cG:=e+h�љ>��A>���s�P=��J� �L�<�j>t�k�.>�ӗ��{�����=�$����>�$���]V>Z�OG�8���?(���>[ �>�go>i����>,����~ >��ݽE(>�:�>q�f>e�>^�~>�lC�'��w�=����`����>�A1�=��=��*>N�>���>Fi= A��.�=Y=��R�B�P>
����Q�*�Q>���=���=Mn8��z�=�Ŏ>�0��{%$> ��"�>�����1�,ӽg���ݗ>g���v�h>�@=����|��@1��{� >}`���d�<oԾH��9Dv=�W�/=�><��='=AYd��Xh��퉾�5�~D�� = LJ��<6�>��>�<�����9�&�������E���Л>���>�� >m������=^V2=���χ�<�Ͱ>�1���c\>͈X�`UA>���z�>�����* >�Z��f��3锾�4����۽��H�U웾zij>�#������w��=n���,1= %>܊�u=�C�>����+���RF�b[�C���*,X����=1(�>#G�>��=-#�<�ҽ�����[� ��<k_�>V��>h�u��@@���K>��=�����C:=!��6�H<���J���Eh���NW=��>>f���ٯ=��v�$Q��^�����������N�����9�>7X�E=���jy�+�8��*�mb{���=��%>�p�>{����wL>���>�
>k��>@�N=�]�>�����Ζ�G>0h�=���=�u&>�*����N������c߽DW>{]�=+�l�����=�� >QF���w0=�?�<4NJ��ҫ<�����/��sk<� x�%�[�����%���>u���M$�o�x>%���Ԟ/���;ލ˽jE�<*�O����=�Q�ƞ6�v�>>8Q�
܂>�w�<|xQ�2�<�r�<�G��d Q���U>���>���=�k��H#>"����=���<EXp�o*T=V�$�O��R#��F��=���=�y��1�=� ;=�RG>v?(>���|����J> ����(>~, ��a��~�н�����G���h�==����h�<�Je������'5��o^�ҳ�Ш&�B')=k0���^¾)P>c�>�Ԛ��e
����=h}j=��"�/鳼�E��� $��,�<�&N��g=�H/����=� q=(�����=J\�>]�a��w���4��ybg=��=N�>�xO>ѥ�o� >�\u=[|��W��=�|=(b�=:q�=�\�=��
=lH|�+J�=&iV�ۅ�< �>ʲ�;稂>��=pw
>����O:�>�����';�wM>L7�>4]=�{�p��=[�G��[�>��8��W>���=���<��>�S��uo���i=���= y��п��漼R�n�B�@>j
��F�� ��P`�<͊>�h��g#�=iJ��:>&��>6Y':m==Q����=�_=�}��w�����=��l��] �l��<)Q����>�B=��=� !>Х=TCm>�wI��� ���=r۽�cX�Q�=X��"�=�<��<<����w�t,1�c�D>vZ�=�y�=T���_�w��p�����>�/뽱 ��<t=�K�cK��2��=~�վ��=+��=� ����j> S>M�e�cm�:�ʙ�ɔ�=�ju�M��=!c�`Q>/��={G��V! =��;>m�q��I����>_���1M:������F�ؽ['���D>Ԧ�=�"\>;Z3��~+> �r>7�k> ��?>��ӽ� ���>�CL���;Q=Ռ��p�Ѿ�҇> #����R>^g*=���<p��9<)�����<=]�L�9�A����c9>1Im�ˣ�:C��]*> �*��H=���=*H ��S���%�xo_>Έ����#���&�b=:�=dvP�T��=C�=1R�Q|5��s��0��<=M�L��{ս�1�"@ �kؼ�+>CF�=]�S�(,="c=����=-��>�6>����Z �=*4>RH�=� ��,����>��==8+�=�񮽩��=�7�QF|==�Z>8�����->pvs>0=�9=�ȽF1H>�� > > _�����������:��>$6n>��<���=������N�� �=LG��8K��lX�q"���=����1 9�I"���-�>����>>�Ȣ��Ѡ��8M>���Ƥ=q�>��%�������(=�FS���s�P��HƮ>�(羚pR��
N=�=b��� ���E>!�Q���!�1Ӆ>���l>9�����4��sŽ�
<��4<SIc>����a��<��S��R�= |%�.j���9>Mp�<H2=�����:��=��)>��!=����~潏i =�鲽0Β>ɢ��>l��>��q���k�N1D>J<c>p[>�L�=����vY����>`�C�COD��>7��<'���H�#�����B��=�������-#> ����{����>Ul3�Z߼ �X��\����=�����1<�>v��*V= �-��}jռ�2B>�� ��4�=z�����=��ʪ�U�@����>��9�M�<��������A�=җu�x�<�������{�Ž�pE����=5$C�
y.>�Ʉ>���>�7=��K���8�}h�5�>5$�t}��!ލ�<���,#�������������欽��#>%��>p�O�$��>�A�E9>��ýǾ0�>���=D����=�j�p! �����>͘��D�� �e�
ua=�끾|=C��g໯
;���<E���VA=2y���'k�
���
�>�g>���<��r��zu;���>V����W���>��9�z�Ƽ)>��h����y�yY�<�O-�1��>G�_>�� >Bx�>0@��m��>�_�<�iM���;��]�>���G{X=��=ƞ���$�<n����v;P�K>A���������A'����>�Q�_��<�H>}Y#�2V�=發��,L�`�G�����
f���/�w!< �'��G�>s�
�i�=!�(=� =�sq�p�>�ʦ�����ƽ�f�=�->l�>"�8>���>��>�ځ����<��<>�TY�(�8����<�s>�.�5V�:[���=� �>b�:N��<)>�?>�Ѽ S�=B������� ��s�#�������+��,=���%��<��=j �ߤ��O~ν^/�������ýJw������t�=�>>;���}���N����r��>���<�xM=���=40Y�f=�9>:�;�+��u��<���=��ܔ����-�NZ@>7 ˾je�I�=�&�>�>u>~V>�D2���>}5����h>V�o>9�=
��:"R0>��=A4���7�b�L=>fQ���<�c�ȣD=��>Kq�>DD�y,�=��ŽP�R=��`=�#�=S�H>��F=��$=��5=�/v>�ג=�q���g;>b��|�>���F>/z*>����� ���
��Vw�=OJ!>�"��������>��)����`M��� �<�) =�="��v=������>��A<��>M�>q�C�A!=������2>�Vv�_����<�_�=�K�>�26>�Ƚ�P#>7���[ <��y���;�<�~��2d="�>���%�=aB>]�=<V����cLT��Ӽꯊ=���>��=�<�=�L����b��`��Ľ��<iCy�bbG>�Ø�&��� *>
���n���&�\>���B�=�Е>�=Ct��@aH���=;K>���=�$��p�=� ����k�ӽ��]��/�>�`����B�� <.p >��V������
�Sߣ=A� ����=qW�{_1>��,>�^>&����^>.e<���=R;�=���X�׆Z>� ���m<V�x����>����\o��{�>���� �/��w��RM���co>�������=���n�m=�d��;�>&�N=�>Z>w�J<v��=(�=��1:��{��>[G��-y#�?VE>oW���v�<�Ά��D,�.��<V_;>n�=?4�>���=+V(��e������>{��ڸ=2愽�6<�[>�?9�����Q�>�G�=,K�<�7����
�t��
�>���>Wm]=Λ�=) �=��>�J�=_~���R�=En=-,V= �-��>@��� ��A>��<��N��/@�� wֽs�a>��}>����!.�-�ļ\����Jj���0�f� >�O��i@=�zU
>>�f>)����~��y3>�i8=F���e}��@]>
 ���*<�:>|u���nN>ޫ ���}���k���>Ldʽ8��ݻ�<��>Ks��l;]�ýL=[罟�<�2���K>P�a�Tб�� >�*�Aʔ�����%��f�=�df= ���Y=�����<_:��R@���L0��Dv>�]�=B!��p��ӧZ�d&�?�W�Aγ�1��>�Y���Z�>�����L�ϽĽe�]=��r>��=�=��/��]�<| �����>��O�3��>Ky�=: �<g�z=gݛ=
��=�z�=�u\��P�:�q�K�
>�3"������o�����<b2�=���=��=<���Ɛ��Tƾ�F/=Q\�=]<�g�������r=�X8���-�G�=B�]>׀�=ar����E�Q�T>�@��a�>�g> >���=2=��06>��z>n��=��Ӽm5o;��ռ� �>���=�[;����<�"�>�pZ>l��d!
=�-��R >3aS>�]��t y>��3<ڽx����N>�3U����<�민���!����h> y�=ж���Ph�q��=b�f>���=��=n+{>E�3>��\>NCm>�K�>wB��{Q����; ���h\z>�������<)Ķ>m>�
���x����砾!�&>Z6�=V�2>���=h�G� ����{����=7�w�:�1����=��>\{ͽ��=��>��=�S������2�=�� ��6���н#jN���=2=�=��J���=F)�<޲i>����}��� Y>Ʈ�U��=}�E�u�.>{S=E/@>mэ���b=-Z征���󽢗��o,�˱H�ρL>!8'�p�C>���<���*��=��`�;֑���b=��<���d��S`���6wڽ������� �_�7��|4���Լf,�='�E=�߀��K�p�d�bܸ=���=E��=�8���/����{>�⇼ �=~M����2>a=U�սs�h� 2�>�������\h=�NS=>���ļ�{���`�=�At=>ؒ�RL�>p3=�
���R�E�6�޹�> !n��׹=�i��j��|�=s϶�>�H>r�=g>7�!==����6�JZB� ~�=-���i������
>�D�=�2>BX��O�=a\q>���z0]��E�=������.����=7,�<?�\���������¢=^����>�-н�#8����;V$�=�C��n�H�$>�:]������>�q>��>��u��[���e9=�z=��a�>���T�=��ǥS���t�5y����m>�o�>h�|>+ˌ��N�+�R�yr���0>�=I��S� ����=U닽.RA>�TȽ�kS�>������G�=!�8���->!*p�Ҁ���|�=̨ ��륽=LL��"H��m޼f������=ҝ�gN�=�X��V���T�����C�3��
��>���<K�2����7�y=~4=�҈���}����<*��8�(->�_�;Rx;p�U=jB��'�=�~��[]�ք����P>�"!>~�K>�#>~">�X�=�Tx=������ļ�>�8<q�{�"g->,�C>��2;������9��WC���ҽ�3u��c:>���<���=���>"2�=fz��>dw�\{���V>�#\<�k+>!�bڟ>aB�h�4���>.o���U>5,>��9H��Y��bD>��e>�hO�J�S���>�it�?�<>ra�>V04>r6�0N< ƕ=�;�>k�K�L����~��(E�>�>/ܟ>*��7PU>��>��<��;�4=��=/p;{�*>=�Q�5�=%2S>,˽�A>���=H��<�缲���� <n4w�y/�2y�=�d�<^Ὤ�>49+>�a�Z8��i�-����<("`>,\Q�l���_��=�m�<E[y��gk��G|�Dh˽�BF>30�D�=<�!>�M(��C>c� =)o�=t�;<��=40R�J>7��&>R$P=lؠ��`��ü�{�<�S�=�V{�� @=6?k>J��_5P�>� =��k��"ٽSn,=|��=��!>�f�!� >��(>�H�9�=iҙ=!�Խ�m>�~��up#�A�e>� �=�� �V�=;jн��4Α>E��=��'>�u����v�O��<��ټ"+����<,j�;n9 �"��h�j@��3 � �}�e��<:�k<O+|�g|�=X����3=�����>���������.��z�>V2ܽ�{->�=<>~毽��;>���=���� eY��ʽ��5=t��=F�>$~�=�ُ=S�>��=��>�+P��W�b�O=��;:R�=��A>j��='��>[X�;9�[�;n1��#�=���=�� );�i�=ֿ2=؉�=ǻո�>�Q-=�:+��h=�Q�����f3ս5 >��*>ֳ =�-,>{Ϟ=�P������:�c���l��o�=1Ǝ=k�>�D�c,�=I"T���>�����Y�2<Nl����=1�<�d1�N���N�0=��F�6��kΧ�ǚ�>��=L��=P�>���b<Ęv��[I���}<4>�L�=(�=$�P>���e�<�6k<��$�T���>e�������v�?��S`='�-��OS=� y=;3�c��|�7�}���(Bn�� ҽ�)��i����=_M�<���q���R��"=��[�c'i�a�h���A�1���v���-�=c�=8��,��� '�+��oߜ=巯=���=5����Z��E
�J꒾+� >1�3�g��A��>���=��1=�A�>�nѽ�9��K�<>��[�3SE=aW}>Pv�=T��<|�޽q�y>bX����q�=1�=�f�8� ֽ�]�>�P*��#�����<�?c<uD��^Z�3��,T=l4��g����;>���=#Im����:cA>ʸ�=��>|�̽��1>Ja�/�/��#��_R��L'����h}��Kl>�C��Q�;�Sj�ᶽ��8>����W�>Q���u�g>�6�=]�ـ�c{"�ww�=pѿ= >�"i��o�>f��=���=_-='��R�a>�\[�đ�=�<>���>��>��Ͻ~�<{ ��O��Iy>gΏ�Ce9�X�s<���=a��=�S��wK#��� >�T�>=>W�a�7��MO=%>S�=<޽$����ѽ1X����>�ɜ=�V<� Q�!�U�S��=g =�Ǡ>W>��j�g�iu>꡺�C�������~��xk�k���t�w>*�>��p�<W������Zt�*�����6��y*�=�e�<�x_��VǼ�z�=�r�=<)E>�ݚ<��2>��=��W��ǔ>�|���ד=Ć����2��=H���aU>��=V���E�>�2��s.>��b>�����`�ɯ�=:����=N��ѻ�)A�>�ؕ��h���B�e�S=a#�>m^>���^Ɩ=b$0>+�>`�)��Խ��þd`�>��x�q%�=���=%9�>���=����'>*C8=�۽���>� >�ɫ=r�>������S> =�=��>y�1>�ƽu�뺆�w��ӫ>�L��%=%>�yu>�r�<�=$�o{.��� =�z�<�-�����F>��w<v��=� ȼ�f�i}8>;�>ҩ= R��n��>�!��� >�6�h��>&��>�X]���K>�J.���?>���=Y��=j>n>iB羞��=��x>��������[,���2����=�E̽8�$��V �9,b�n"�L�>����|T�� ����V>�jq>�ʾ��-��%��!��(S�FK5���<�,�a;/~���q����=� 2��<ȼ���>�L�����>nai>i�k=��)<��?=�<hS�=�%&��/>>�:5<�
��N��<潷��=A���~(�C��=
�LS>>�>k �������#������
|�=9�|�O�"�s����=De
<a�#>���.C#����i>ax4>VX���H
>;>q���LI@>�ξv�y<9�潡�>Sn@�C�>��)�Ƃs���=>р�=���=uDe�A)�=o�L��`�;�[R>p ��~G=�p�=L�=�>Ĭ�=�T)� :k>$��;� �Ԣ�<7�M��:�>��V�Pe<�-=ɥ���N��c^S>֕o��/a=8��{�l>�G+=tk�a�����=\ !�<V]>��9��V����>�ƽ�1���-�=�x�<ՠ���s=|��=2��>���<-Xf>\�ݾ2�<� 3���y>�->H��=ɛ �=ű=vN;>�{k�[z�`����w��%| �j M>6�<� >�m>���#��f�ʽ����R^�>�s�=a�{>
ּ�Q�����=�酼�n�Q���显�Ȭ>qX�ޕ�<�����q����=�����s`����q��nN�;]��=���<��%��Tl�n�Z�{D�<���=BƵ=6+Q�����>��@>Z�鼻2��w�6��2�>�����pM��3߽�.3�w�#>K���]�=0����5>��>�w�<̍�=#�&���C�b��h0��z��=I�*��u�>�5�=f�>�1�<FY;>)�u�5&=�U�{/�>��>�õ�R��<0B�|ڗ��t>�X{����=���%1��_�=� �=����3���%om��&B>�<����S�6��CZ�=�e>[N<��#��>�8L���ս t���,����>.��= `�yE�m�%�mK��C2>-0�>j����+ =DZ�kgG�������=# ������;��3��N�D�W��L����=_%� �y>!�#�Q�X�DP��}�V=�`B�L�x��Kһe�=���=�3=��/<��|>��Q>(`q��wj:}��=p�4��k=��U=�-�=��W>�H��f9=%�j��)�>F�+����|&<�� ���=�Q:>߇���c��� ��iX���G�7ig>3� =�"#=ڃ ���>�����UW>_">��X>�豺G0���>A`=-G��N�=k��< B>��=�����C�ޣ{�ܐH�T���i���6�<k������k=I���q��u�=ƜU>����9�K��`ʃ� ��=�*#��'G��x5<ڒ��:�N�U���T�ƽ���G�޽��|>��=SLj=�>3B�=����Ϛ;t @>Ky#>Wp=:����z�>#���}�>�Fq�A��="��<01f��� >?�+�~�5�&7J�=��ocR=�0�<`\��6=�M>'Gҽ�R&=�E�=�ū>w��=��K��%�= �%= ���Y�%�=�=̫�=�����tĽ�q�G�`=�G����;�qO>�ļ�O���h�E25���;� h=��U��꾺r,T��g�Kw>Ik�sI;�#==�>Kܢ>.��=N�>u�I>3/ý?�˽HbC��r�<���m�!>�G=,�I=YR�>)7e���->%I&= ��=����~L[��-=�,,>x˃>�س�,'>}ς���>����??�gd>��->=��<O�p�T��?Z>�[�=��={��=�
�:�>��8ƣa��]�=��=�L���B�jb)=f���$�=��=+6�@�=L�'>)�<X8���� >�*?���/=�=�� �о�==Ǯ,<�p����N�m+�A_��#>ŗٽ��=>��=�Y
�T���rC=��~>�>S��=�+��/=���Q>�>�v����;��ʽm·=8�9<C�"ɽ�ٽ��p;u�=f{t�4�ͽ#�>�����ɿ��=��`>%0>Ur��8z�=T�0>�aʽ����ώ>=ս�&W��'�����<���� ��=�E=�� > �B�b�RT[>\[> G>#I��n�=�K�9�ֽ���=��+��^Y�=$�#e`���ٽ �U��S�=���=J�+�1�>:��}�G�R��<����+���'�����=M#����<"j��$�<X2������v>#�2�����Ha�����L�=���<�#*<���=N�3>��v=���<P������=�N�=��K��,���>3;��M�=�l���5��ܘ<RZ�'�=��������B�>,:�=ncl�V��=�;=4=�1)�b�ڽ�;��k7�>Iu�=V�I>g�>�Z�=-�o��f>(݂>��l���/��e?> �>ʙ��&�(���->�">C����3o�7�ܽ����KҼ���>7�>>(G�W�>JT> hO>�-&���U�����1J�;e'��JK�(\�>OtU=_ɱ� ��=h>������F�ֈ�=�Ck=="�>���=+��>)a��OY>��=��@>\��u=�>����>.�l��h>�ƺ��v�>�ǀ>��=\�P>j� �(�d�����>��$���R=���L�
��W��߈��7��>���={��>�U�=U�>��X<q��>��8>�mK�r�=���p>ʧZ�E]�>i�m=TJ�>��,�D����S��&?��������ɖ��H@~>g� =��~j;>Ҫn>�W�@�����fD��� >�T >�,��Mn=�H>��Z=7y�=W={��=@c��)^>�a��x�Q>U%��li;����>>�<�� ���<$�I��v�<i��=�d�>�ۻ=�v��)���>�����F��e$�=��0�K1���O�lTɻ��`> ��<0�-=�>TC�9��>~y��罟N��˸��8>�8Q�_>�gZ>��Q >o�m='XQ����=���X|���(���5����=�>=���U��>R*>×�=�����I����>=����>����񟻛8��NM����ؽ �\�C��&(>
!��ܺ=��q��A5���\g=����=>Z1���>d_�>zG ��X���_�KB�<�в�Ny��� �<,A�"U�=U(��B�=�,��T\*��-;>i��=�5�!Z=� >?��c�&>3F;�M���ؾQ�܁�<�Aƽ���>F/���~���f= �q<C�>]\��P����>�^��P�= W��1;2��>>�i��5RP>im����>l�7n(O>
�]�ĀϽ{s��&FT���y��gh�ϥh>��K>L���A��o��>﬽�� ��.>�N> =z��F���=AQ9�bN�=�>����@��ڧ�=B�<��!=绺<5���ظ���F��
��I#k=ѹ >��=�����>�S>��d=V'��/|����<�Qn��1�����=R��=�G�>:%=I�D�j����h�� "�>퟽&��}=�~:>����%�>TP�=��5>���>k�u����>L�>��s�0(��:=�ž=�r���{1�1Q�>�!��Ri�?��iv$�dDU=LJ�<N(>��=�U��D�;�潎M
<ij+�y��<�~ �1�$��sx�o f>�64=M�����U��,����(>���<m���>�(n��J�=~ɽ��%�/+z=%[�;̠x����>stx>:��lX>���=J��=2e�>��ּ����꫐�AF>����E��=�;0=i�i>�"�=w� ��r������[I=Ü��ą�=��_��i�=���U4=�x��qA%�PU��ŧ�=��$��e�=խ�=�Ň�qؙ�n0����=Q��=��l>�>��*'ʽb� ���C2>�!��I�*�X��"jͽ�W�<�p�����W�>��B=���%*�7nҽ���<��W�ƕ��ZD���a>�����J<�Γ=��$�E�\>�.��,���),��qq>��=��0>�Pɾ�ڂ>7*���O�>�����F=-%�=�D/�I��{�=R��=&�u>�+$�1��D��<��>�=��:>J>�j�5�=纞>�*O<1:y>-⢽�@�� [��"�>t����9�=M�=OB>LN?��&}�XI6>6xP��$�Ab1=yji>}!̽�?=A�=j%��-��� >�6l=��Z���>M~a>��k>��=š꽤EŽ��*=)��>d=x�t4e=�+s��k >4С>��2�W��=_bh>Jh�5������Ce�T�H5>l�Ͻܨ>��B>�_�=�W�=���>s���U�>�Ud�Y{a>B%�>��ʽ��U=�)h<�#��[#>c�,�2:n��>�����=� ���Ɋ�m��=�Y�>w�=rn~>�3?�|m�=���`,�p�����
�V>R��3�\�t`&���%���0>�oc>`c������>�#�<�<�=>}�����߽����t�=��x= ��>�ܡ��q�>�N]<�<��/3��n��=�%>y���B�׼yx�>�?M>"c�=�ㆾly�<�b>+�=|��==G�=O/���$���=�u���(>��s>�jƽ�Tv>���=Z��=f�=WZI;��=0��=�L�1g�=L��=Im̽:?0>�ֽ�� >�)�=��=��>z�>є>��콘�D=u��=��=��*��=@y�>� >�)���?1�Zd>��Pц>2�j�h>1#���>$X��({X>�>�:�>����#�Ի��?���н���=�L ��Ey�=�">�6�M�=�=2�#��=��H=�����b��;�<� M���Z<�'��^7>>=�#<��i�nDt���B>��e>��[��+o>��J�|`�o�=���hvA>���2������OQ>%���_J�������(�B�� 8�>�'���QZ�7��� ��[R�=�/���P�=�����.=��I>ƛB>��Խbpѽ�R����b=�1>�\�=[d��������>CJm=�>�\�<OB>o�־��n���r��}׽�պ_ ͽT%=^�\=��>��t>"r>пp�6X�=;'��߰���&����&�K��ߪ��5f=z��<�vA����>� 7���)=�c�=43b���ݽ�{���d=�1��p����=��ټ]�l�'<>�ƍ>��g�'�H=���2�>����k��QGW>}�*�z����۞<~׻����Z>���=o��_�>n�w�\-��3>�i�|/=Ȯ9�����~v>j�(���n��f�4�н��>>#>��n���t=��=�� >��4>��¼:�=GFo=��v��)<�-���Z0>X���r�^�[����أ�?���q���q��= b�w 4<3�=�X=.� >�������b�=��r��P >cl�>w��V��S��=`x߼�)Y������#�F��yY��P�=rR��(n�<���>ނ\�];C>�Sc����3[0�+�>7�>�죾��нi[>B�нy�<�C�i�W�>�� ��]�=������)jC>0��=�܉>J�Q���/��AL����=1�� ��=��>�!q>�� >����I�� �lZ��ޥ>;4�N��� �>G�">�g�<N��>iH#�����^o���<��nO>�� ��st>��#��q��������ʺI����={yɽ-���;='f� O,>g >�詽P]H��v���=������
���=��m��|'Q��3�=��=�<f�����<ц]>��A>+�����=I��=�˅>�ׇ=�P�>���=���E�A> |~>���mXѽJ�9>-μ>�,>��->��<�J>5��=� �=U���=-�H����+7�1M�=tt>R��>��=�չ>L�W>���=�-��+;�>f�D=�!��NI����:�����>0�.���7>_7a<bR��=;&Ѿ�����B�=���>�d�LN>�c%��z�<Ge�=�/�<���9��=��s>��_>�>�,Ի)y�CES=���;)�!�� ���=8��=���=�4彊5�<Ŵ�����=�������=o0���%<�Wڽ�mj>g%>���=�hk���n�B�C>+��}|=�n>�ˎ��1\����*�h��C�<맽kv�L*T�<0yY�H�{��L=� �+�=�$�=ߣ=��=�U�:��j�� ����= !>�,�>�<�`R;:�b�� >ӟ_� �ͽ⓽�،>Q
:y>2��=��>DY�>\p(�B�)��(>��>�V<n^a�Z��8��>uS��ï=P_��57޽TP�=X�Y>G���L�D�CZj>��"=g���LJ>��Խo�.>���<��[>�;=I�.=��n<-z>d�y�\i����x���=�a=v\$=�o�=�������U�>Z��e;��ϴ�=H�S�*W>z�j>����7��w�<��ٽȘ�=#W��x>ڞ�=#A� ��=��U>X`�<서>���Y�O���R�]:���������HE̼��-��V>i��� ?w��oQ�n��s��|ܧ>/H���B�=շ/=���<Uz��U�=�$���ݼ2ͩ='m��D(1���
�{T�=] ^>�f$�� >��>�`�run>�����ν����:��>�<(>|�ĺ���=V���l"K=g�8 μ;.0���>w/��io�>(]�=+�e=��>
�F�~��=���wXT=�=���=��5<��K>��t��A>�CH��:8�Q-)>��:>�[�>bc`=0D?>Qi>QT���B=�\�67o���E��*>>�6A>
����� �9Y��9�3>�ȝ=3ֽ�}E���E����A̕=&�K=s��8��>���}���з�:�($>�u"��y����e�@j���D�
[
dense_2/kernel/readIdentitydense_2/kernel*
T0*!
_class
loc:@dense_2/kernel
�
dense_2/biasConst*
dtype0*�
value�B�@"���r�s�=)�<��H޼���/⵽�D�=�6b�� �<֒b�1Z;�.�%=ۻ���*< �v<�6=���:�׽���Ej=��� ��<^����&�<i��<u�U�m�;|Ɋ=R]���=4�&=8V<�ۅ=� �<���<�z��8*�<��� �d;�0^<=8��P�>h�<6�C=��¸e5��������q;��;�� =�A =5m���:��w<�Ib=5�/<\�8��=V/��MA<1��50�'��Q> >
U
dense_2/bias/readIdentity dense_2/bias*
T0*
_class
loc:@dense_2/bias
j
dense_3/MatMulMatMul dense_2/Tanhdense_2/kernel/read*
transpose_a(*
transpose_b(*
T0
]
dense_3/BiasAddBiasAdddense_3/MatMuldense_2/bias/read*
T0*
data_formatNHWC
.
dense_3/TanhTanhdense_3/BiasAdd*
T0
ǀ
dense_3/kernelConst*
dtype0*��
value��B��@@"��O�_>Q�v= ������>vQ{���˽���=� ؽ���h�:�B�K�!�d�A���=��S<��>_�J>�xV�� ��>0��c?�>�u>��Y=�M�=�һ<�J>� >���=#�=l/�=j�˼t�<̠�����c_�;Eh��[g�>@ſ��3�=K\��'>P=YdA��Y��a@��lc�Vi�-
=��"�K�>������ >��F�ɗ����Dh��-���HYa�w�>��,������|O��>R@4�R���G1����� gi<P�t =�T>D���&�g��<�j���r=�Ө��� =J�>�R
>&�(��?��� 4 �-�����>��'��}�>�⊽��|>n�������� 9>�R��X� --��R2��9��_��B"�=�����pF�����tа>�,��S�C�f��=7� >�|b>����K�P,�=%m�T����u=ȯ�� Q��u���?l%ʾ�i{�^7]���w� (/����H�>��Q<_�K>�za=[�N�����ǯ �/��>i�>$��-��=�p�=K��#z�>��V<�;>�vɽ�����F,>m�$�z�>��>�΁��~ȽE�>��G�2�=b~>l6�>y^�=G�v>y�ѽB"=��4:j�P>wu��7V�<)�i>ML���ċ�O<%�� 6>�7;�v�3��ߺ=�wL>I-?>���=�H�8�6>�9�>���=f�\�F=��=v������zy��������=i�#�����3�N��9?��oa>��=���>a�Ž�T���eB>�'���q�>��=Rf@>��߽�Eؽ�UD?�/��Z,>�^L=��=z�E>��=5s=��>��g�>?���%�=�;�B�P��>�<Ͼ�+��!���1���dD���'����N����v|=(�d<�����=ny���eU�yt��e8�!?>���k�0���Լe �<I늽��;<�s>���&=j�H>4�5����=F)��݈>h��v]0�<6᯾��=&�>���;?�=3��=�9_=��=�C���SA�yG =�n�=� �Ȳ�=��}>�R��c[���&��l)��`�Ӿxt��x��F�l�^;2>�w�>m�)>#��{[=�W�<�F>t~/����<�;�oƫ��[�=m:>���=��=�{>� 㾝���b>=!G��$��'Q]=�R6�$��>B�ν;�oUy�p��>��K�RN����>A�D>�6>��R=?/U=���0�ɽ-�s*�>T�S��Ь=����1�t�(�=oYn��� >A�>o�<a�>�u�u��=]/پ�X��\� ��$� .Z>xF�<XK>�>�B��‾�>�=�H�>�����Z3>dF>`�=_8e�>7н�MP�������=k��-���ǒ
>Ŀ��u,���]�ҟ<>��˼�}��ҟC>&ʽg����U�b>J���e>�w<>�b��}�=x�=��B�sn�<_��x�ۼŞ��#J]<cO��� S� �I�'ͽ�9��T���,>v8ʼ�̭�j��;b=����U�����=6ŀ=����Խ�Q��緽;�<�UV>q�r���R=%�j=�<��>>��*���\���Ԍ=t�-?���<K�S��>���>�2y�K�����=���=���=Y@>>�7���X� ?�;Y�Q @>5[��0�>����`��>z��=�R>^~��I�{>�}���2A��g!�P���S s=�p��솾�F="s�='<�>�Α>-����PV>��s>����xM>�T�=_�k��?�� O>�CI����>����t�9B���&�b��j>������˨��1�����=`�>
$c�F��=��=> 2>J{۽�A�=��J��Ք� ��=�fM��z�=46>z�G�ļou���|�2���r!>���=�Q�=�A>�_�<HV$> "�>2����R��A>k�8>%�0�-�H��!���U�}~�6���)R =�f��A�<��o�<>DL��k�>�+��w9n=�@C��-�<#a�y�%�;��=h�<��
�9�x>m��>�Z�B� 1~�5�=CQ=s��<R��G��;�����|�=�>�+�>:J=L�.>�&�<4@1��X��kϽ��ĽڅN>#f�<����p�j>���>Ƚk�>��=2�s Q>#p���va>6A>�y7>�����=���= �=Q3�������=8>'� �1,2>Y��1ͅ��Й<�=2��Ng>�lg�9>9���d�:
�����=m�~� 7=DS��!�>���=.C?gG���d<�ޘ�=�5W=�����_Y��"0��@����=r㩽K� =q�����*>Zý6N[���>"2;>j�����#��>���q�}��>�7��iiQ�\�>�ȹ<�vp����=9��<� �;��&>��f�� ��=��_��͑��a��|�ֽ�=���)� �P� ����g[>T�1>r���i>pX��;�K���m��>�>���<j%ֽ��=b^�=
/%<9�l�?o���c|�F�7�v8}=����r��t&�;�Oξ.����A�Ev|�-v�=V�.�D�_>���=s�E�^M=���>__7��x�q��;����v>�-^>���<�]����佢���)���۽�Y�<:B�=��c
:��{>�=�<�f�������=O4��c}>?�G������Q�V�s��l��^<�� ��ع��>W��:?�ޭ���M�tŠ���5>��<���=�Q�=N�=��+=ݣc=]1�ȸ.>�~�=�
���Un>�>-��=�ֈ����oK�>t�X�;]�=wB=a5>2�K��
<>��\�fC޽'af>K1=<��D��>���N��,����FL�]�>cu��5$4=ԥ��:m�>�#N=��G�w?⼠25>�q�>F�=G���8D>}`$��2�>g�Ƚ��>�����=��d<�[+���!>N�V>�y7=��>�m>A�I>H���2�>�-�>#��>V?�4�>��S=؍�>FK.��n
��� >�U<CJ9�J��>m%U��f�=\�>�yؽ�p��U6�=���E�սP��.3�<���=�>�w�>l�S><:��pV=��>8%���E�=]k��1��e!����-#��,?3>�m5>?u��� >>y��ux9>Z����ٰ�8k�=uP�<T�Ǽd�)>'U\�Њ��]�Z>6}�>J���?����Z�=;���"�>���>)Z��I�>��+>��4=�񷾇_��Էj>�s=�ݽ�/�= 3>Y�����[s>5�>�Ķ�/�<�&ƽ���=>����H<�AK>����K�6=s�^�o0�>[�i��ן�J@=K��I��=X�R�=↽>XK=��>�� ��s>].�|�Ǿ�Y����O>+�A�~2e��@�=b�<<�rͽ����r���I��>�lC�XR]�aO�>$�<��~���=�l�;��ֺfC�=��
�_�=��”�/U>�w&����J�t={n>-�h������E���>UG>����&�C��Ȯ��vG�<8v�>����/������ɲ>�NF������d=. I>B�7��s��K�>�m����rq>>%��=6�=��V����ﳻ�7w�Z���>7�M�>R@>�.������@>��s���C��<�z>]��<�K�=�_<��=>3�Q�*Ҿ
�M>��e>9�Z�0Ɇ=v>�v��]�l<}h>�\=Ϸt>�0>q�J��r��2½Â�>�y�<BA��=;�T�>�4��̓<��A=DU���s�>g~�=���;$���M>���=���4~�Hq�^�#�-O�>�6y���+;Uu��2]v���I�O| =�j\>�sT={b�=�ߎ�GR���O~��� <�J��틕>U^���-?��c��l�;�~*>�L޾G��>Wj�<��|=D< �.�u>�>�8I��R�=l����f�>Wq�=r��=�#���7�=�оf�<���,$F�Q��>)?�=Fq������>LR�=؞c���E�7�;�@\���=~��>�;��M�5��@
�i���"|�>�p:�B ��jv>�r��1�<�o�>̽c>�wj>`��>� .�%�d�#��<ȱ>�#���&��A�k>
n�=ܐD<�Y�>I����W�]�N�&�x>Ɠ=�~>Y��=��>}��~�g>�d�>tپ���K>\�0����F��<���l��5j>��ݻ� �
]=�dp>� ��J�.�S#�� Q���*�=K�O���s=�Ƚ�V���w>tp�r]B>�����k����Bd&�3m�>��@�#C+� <��K�>�� >.�=�_�Po��]�6��N�<�p�=� b�:�)<��1�0b>R��-��=B
�A��=Q5 >{�!> �C>�n���)���j�|�����^ (>D�!�i>���=����������7�8��L�<s7�3�=�]_���<�X�e
��F��S=���<䕊�Uw�<<𴽧^�>��>s�X;����C�=�ט��H޽� ���M� �����=w�H�.q>�'>>�ͽ�m��r�x>U�)�.48��z >S_>"��ʮ>.u�>$hb�K{+=�A�>0�r��;��Ŝ= �u���*>_o�QAH>r�"��\�<Hs�L��#� =�%���<r�2�*~�h�j�[p�>ܞ=aܘ=[��_T6��@���2=F��>x.J>����F��>�>����*�f�>V��=�u��er>��y>��=�3��~&=���;M\�= <���oH�_�X�Ĩ�1�y=�����=�s�ڗ�����<ި&>$�#>�Yv����y��=���Y=ny>\�R<��<�ϻ=�1�=�j3=ݛ����?���9����>�թ����=Sþ*�5=��+���ȼ:Ji>�֬��ƽ��l�q��=]/���>Ab������{8>&~�4'f>9�J�N+%�����{=A�w�k!�!L���w����=�C`�GJ|=��<M��=h3��FL<���>�T�>Z�<�K����=��=w�>L˾��=��s>A ��ȉf��i:>AF�=����̨�<��߼� �%,>.�q�
=5��b/>�䆾�u���<>�Xe�P!}��.�=��þ���)\G�Jm3>����o��=]Nֽ.rQ��j�J��z@�<�t%����=�_$>�U����=�Z>dsn>��J� �e>>N�-�3>�j�=���=��i��`=p]����H���N=��D���>�Z �"�������u������6��jYb�D��=C�Ž<�݇��.=ս�^>�"��=����|@>"z�� ��=,=����H�����2���J������8�=N���&8��G���w7>KY=m�P>��!; w6�8S�XI�=��1��<� 5>䗤��*�=��*� �'�\��r�&�ԝ/>�=:�v=�b�<�t�>�8>����E4_>�����������\�>�f߽������>���`�����=ΌB>-A'�R
�$���0F<�CB��,L!�ii=��>7p���~k>�)�=�k�>Rˡ>B��;��6=]��=�",> Â�q�P���c>`��> �b�s�*>���ki���&g�/{����t>��!Q=����
>$W>X��� ��`��>ӏ6= a]��%�>ͬ�=ON��<�>�F!=ށ�='�>/!���,��nc=&��<���-�=�=�] > �2� �.>���=��=Ty���h=���9l��-X>Z����v�<��t=���=ڿ5��F<L��X�9 ��}�;s��>3/���[����Ⱦ��>�\ �������p���)=���=���=a�<ǾYHF>��^����=;?��
D<�9�>��>���=39%�� �=�v*=�Di�Ț=�U����F��L�>��a>i��=A����S5=,H7=����<�ͽ-l�<�ݶ=M�z�̟o>�2⾜�\>�k�=�A��}�>F㒽��=�fټU=E���q�7=w �#��=[�(>���]{>�]H���Ƽ� ������'ku=y=,\��b H��p̼���>��Ż�SO�H~8��c>w�J>��p>��$��K����Y=�C�QJZ�/� >w�{�?�=�OG=_p�p��=l:x�qf���d�d�<��=��[>-�>��D��f�<��w��$��T��4O�_ �J,�=�q�^�� Gt�=@�>�N�_�;>��s��ʛ<8~�=��]=� >>��!>l���>��->�w >T��W� ��%�= �� �:��=��>+���Z��D�<�����=�E���]�^0P�z��=9�)>j���|l>M���:�=O� >���=9
=�=���O�zBA><iҽwvB�n���=�h������φҽ��=<=Q�L�>~W�=G`�L�K>B�>IϾT��>�(��P��<�M� ��՘#�.�&��S�����<X��.���� ����=�G�=�+Y��?�>xd�>y���Y �����>��2=�8�=vb~<}�&��M����
��3:=��m�&բ="�_��h�=�J%�����.=̅��o��j����>,|>K��1�> �d���;��[>`�=:m]���!>~��=����Z�=:� ��f'>���<'RѼ� м��=ϔw>0��ɫ=���>����)��R>��=E-q��3�=r�?>N�C=��>���u5P�t�*��� ��B�:�3�C�\<i�=��>�5<����(`��'>(�>�8�=<��>�����K�=�v����>6�ټ �þ��A>%�ͽ�z">���>,0�=ٱ����I>�O'>��������< �<���=�7��'>��=��y�=�i ���̽�aܾ>��<�8�=^>ׁý.���癀>q �="��<��w=��:�5��'��%W>1��@��\`ýy�>��,=5�����<�*�{�?�k�i>SG>��������a�>�!�h�U>A���*y0����=�e�� �<�۽�v\�+>��x�}<|�>�VY�/��=Bq>*T =��߽.x��QҪ=�_�=lՅ>���>#1�>g+>���=�_�>�>�ɽ�fQ������b��G�{>��(��"�=.����¼dT8> �ٽ��:=� �%
�+B������8'>�׈�D�*>b�����"�j��$V!�.�����-U��qw�2�&;�g�� �`[9�⚗�Lq�=��=4GW=$�=�E>��=�Qb�>f�y>�����O=�Ŗ>*��=r8� O�=�>�\���J>�_ ���k4M=-a���׽������]��<
\x�z3Z<s��=�C>O����5��Ӈ=�}L>�u<L�=�'���4>���=���<�A���4�¤]>�D>rh���d>�!a>�̐>��/�����Á�S �=���=8�= ��>.)��:p�� �>xI�=r�=��=�i��$���ε%=�C=�������A�R>@͇=<�o=~<��o�{=�.��o7>��O>a�%�ŧ���j�|�,>[�a�=���1>�SI�E�)R�>��<���F=w2���=ޥ���5��R�=\���!����/��=��5Y��r�(��G����>��ἭD�=��9>u">W∽l�Ľ:y�=��V>�~�=�UE>����>1�g+;���=? �=���=$���٤d>�=@=ȿ޽�d �qP�B&+<�|�� �=���->¡X���s>D��^��=�̽ڕ>�4`� ܾNh�>O7�=��~�� ��9ӽ,�e��>�3>�B��uk�>~�O���ټ�މ>j��m���C3>��I� ����N��W�wt�~E�<_�}��c���ѥ=�ݦ�,�>pE𽠘C; H�=(�v�Z�>��t>����Β�ۑ1>|΀<��>4�L>�sm��0=H#ֽm��;�߽�w>������>����7��<���u��L/`>x�&=:ں=�-E�����ފ=��O�=�~7>�r��V7d�A�>�>ʽ�o�و���$�>إ���䫻�Գ=�:�<^���]>x$i=�R˽���G�=�t��;a��h<sQ=XUj>��K>�^=����a��� ����:��Xh>�2>�]�={����'�>Q���Ǽʺ��jB�>�,>w ޾L秾q��;]���[��=�b��㬽�YH�x]=>W8��8���/�>��}���缏��>��<F;��>��%=���<�+�=w���DZ8=�����4�>!w�>2;���=&s=˓J=,�*��m��r/>>�PF�1� ��Mr=X>6(��vֽ�s�=U5z>��=@�>\Qj�p���wwK����=R}������X>"��J���e:=q���4`>�� >luƼ�W> F>�E��i���ɮ�@���'��h���Z�m�(>���<sM�>W@>`=����f�=%
�=�{��"N2����[�=TQA��V��̙?>;�>�yH�m���������Z��7H�}^>��
��������=�;+Bj=7�=G�>�x*�%SV>| )> �>�n>�Mؽ�^6�����"�B��5�����^ۋ=Px�<t/��i�%�9 {�S�F����=h�������t徥>⽁b�>{8�=����\�=������X��|=Bg-���Y��- �1����=����ւ�=p�ݻQ ����h=� >�ƃ�.r�=���=n *��1 �Ԗ">�=�O����X=ҰQ>"�
>�c]��}-�����n��)
�ƸN>K�2>�r�=�8d�V��=$fB=ՏI=�-�>�M~��.>��+�[�a��bɽ��[��z�=
<���*>���� �y��<=� �MBо�u[�`r��5��=������˾�!w>̙ɾc=KS4���!�Xz>��$x>߫���B�������>$5��p+���)�о?>$��Ȇa��V����+>�nǽn>4{��>��=Z�$>^��;%����t��>��m�e$�����>��<�g��(���r=�0�=ނ�>2��<�x���1�=���=��3;ϙ�P�Ͻ�ݥ>gZ�=W�>�ng�ZϏ�_~1�z�'�[�>�~>���=F뽇��=���n�OA��0bB��@��˄='�h��<���E��m��ʄ�>�\/>M�����o=��>�� ��6�<1��=��7�]�M>�f�=�a���>��Q<M�=�C��3���޽�:�.F��q�����=MgV�E�>��j=#G�>r��o5�>� �>��/�0/׼����}�ǽ��<=��t��5�9~ >���>�֗�tR>�u�=�g>�� >QP=�e>νs=ɵ=����䄔��[��F�ϑ��`��=f~9�����F��=���=�c=�������=m��<�sJ=B&���kýN>ɢx��#G>�'�;X��>x}�—L�f�B������*����>�D > F���<�䗶�������=�4�_s <�����{�=�eq>��н�^�.8̼;(y����>Ӹ[>0��=����`�=�б��>���<̕�=֬4��v[==���6P��t�<ݾ�;�ێ>��=�k�s=&�=�&�=}�!�m߿�3ν���= ���6��C ����=DX]>���1�=��3���>��(�� ߼�5�&�#>ߏ��D�&m���'>H�u�|�o>#Z�=co���?�F���w�>C�.���=his��Å���F�L�a=�Xh=�BD=�L����=�~>�Q}��� =���<�z��^�<����$2����"b*��:j=>�j��$�=Y.9�=��<�{�~�z=�u�!<H�p�e���=B��=.$��h���e��W7v��q�=�O��bd*>sO�>�^�V�4>>�c>�d>S��=�X�=L������t�8;��H=\�=KK����n�&Sƽ_�~={)�<�a�?��=�s">���_�=�ѓ>�Y;����F=p>e�+�՚�l�>!�����>���<i,(>~� l��`��>���' =��=�B1�E��=<~м-9�=�㱽��Z=�В>�fz�F=ž3�>���A>�:��9@� �>���֓ヲ&}�`�+Ц=�����S5>%N*���=<�ͽ�j���=>��Ľt�n����>.��;���;Ξd�d�>ҋ�>Ct�>�G�>i�����ؾ�=�Ё�b�ݽQ!Z>`)>��ʽ��/>�����^�=���<E}�GL�<��K>��=�Î�>K�>�����0>�W�=6�����=.W>>���vS���a�>p��������ü��~=��(�Q�V<ŧ�iU�=:����sɽ�����H�X� ��= EN>qn�=�bk=Ȗ'��+9��b�=�y����y�>��!<�4 �2+߼[$!>�uý�g��戾�]�����F>r�O���g1���Ӂ�Q�s���5>��齋��=Q��=��7>�+>=N��W��=**c�O�ʾ��S>��>i��>Z�&����=�$�=`�*���=�ò;W�N�T=���9�\F����*��Mi׾�9->v�:=[8�@pT�Y�&������((\>�F=�&�=�֎�f�= Pǽ��뽨�C=�E(��8R�y,��H��^^B>�܂��D�=��ɻ�d �#�>4Dܼl�$���8��S���>k��=I����5>-�6�3|�=��=oZ�<�ֽ<�T>�c����>X_��U�>������㻽~Ү=��K>�X��E>iN��Q޽�FQ>ǩP�.,9�^����B= ?N>��>�6 ��~�<��f���=���t���ɕ >\O��᷹�n�>:�2>��t��9�= d=�B��*�ǽ�Q=��|�
�ּKBb>j�U�pm��ͤ��n���:>b�=ϲ�=�I�=*������?%������>-���fi >�� �ν��2�͟>��#= t6=-v��o絽>�ٽh~½˵�>
������4��<i`�>}���7{�=]�=�*0��9�<$�;�@� >?+�>�7�;+���QK�=_���Yތ�K�>N���n ;�- <V\��c4ǻ��v�N#!=pА��f >9�q=�F���<�F>��)�>k�E<��(���=|�!>]UJ>WL}�J�p>������@�=y�bY��Q���-��><��>%��>HU��t�{=���>���.AJ>����0�=��>��ᾶ�`�n6�=ၽԻ�c9+���$=U��=W"R����=/���U3>, �=��a>��MP�>�� ��o>� >�Ι=���J0=*.�=�^�=*/;�􁭼��s<���>4�����>B.>��h��}�>�� >�P�>�5��P�?=�� �l��=�����>��Z>���2,>��a�q#��[�=�������LW'>W���c�=�r�>WXz>z�������͡>'��C?i>&.�>�H >{b�>E�r>�*�>��P�0�>r��<mEս6�ݽ �V�&�v��(d��f>��\������dL=.5�V���zF���=��g���Ľ@��S1>�l����=ն@����=�6߽ZR�>����ϞϽ���/��=DꣽNO�>� ���#d��u����c��v�]�K>�2i��p�;���ߠ�>@���ˆ��z>:>�+�H�>U�>��<{��>Q�$�c��<Gn���=X���,�w>��i>�冾�ꝾX���R C�T7��?�>�(I� ��gג�s�>:<n>+n$>d�3=�6���`>�Q.=މB>l��<r�;=�?�>�����]��[ >Ŷ>���=h����%��EQD��s4��ۤ���=�#�=����;�=Ѫü\���
�>VҠ�~V��>���&��A��=m�֧>d�˽Nx�=�Nh>ԕy���=�<0>L?�>W/j�*7�<ϵG>=�y�n؅=<��>�Cu=�s���.>�f�>� <��M���5>zbj>�ˆ�#f���8�3YI�)�^> ɦ�$\�=� >S�=ȷ�AL���t~<M �V\��yv�>�B=gF��w�˾y����>:��=ws�� �L���*<�q�<1J�=�+:>N<�=����<�ں� �+>��#>�` >Ym{��}�y�=I��@_�<�pT����=ժB���ɽY;��{��=�5�=�3#=<�6���u>Q�O>�j �CP�=ᄽ�"н�s�=ñ�=�FP>���=g�<Z^�=Kl7>�;��WR���>���='ը>�>�i>�#?��=,&K���n=;�� ��R�T�4�w��ߛ��s��=6n���\��A��8\a;I;[���Y�+=�13��y���%>&�o>fs0=�a>�w�=�$=���p��>�K*�,��� =-�
�_b9> jQ��軘ə<�Td�2|�={nQ���l��^�>��n���#��嗼R`:����'!�����P ̾��k���[=�����&A���#�E��>�5��w��>�郾�:a>��1�34����<��v��;�;������<js��
�>�鷽�tE����>���=��>�U<�N�> �6����&8��7B���&�����������Y�]]��+EI�� ��=��A=wߤ��[C��` ����=D����'>uc��̥ >�5ݼ9A�=�;N>��>�0���=�������z=���b>�4>���B�;�t�=�歽�����7#>��=�>��ݽ��%>%*k>���䎑�`iϽ���>9��=+Uk=厍=�����A�=�\�>]��>PĔ�^w�=pNa��*W� �/>i��3r=אu�-6>m6��h���S!�� Խҍ0>� ��A���n�?��&I���+���$>{�T�*;��B>�9ȼ[��=��_>�?�>��Q��\X>L$6� �� o�<M%�e�)<!#�=��=�z�>C������B=���=gCx>��4>�:=��;Vt��w��<3@�;e_�>#.�>UN���s����"9^>�5��L3�rh������B>�<a>�W'=���;�4Ƚ61����&���=��>�-=���= �����)�ؼ�>oiH>d�c��� ���T��
�>�I9��$佦��p@>��#�
���L����k>�uf=%�>3���62>�|s=$>�
���N���?>D���H�<�i���q��H<�>z�k=&�m>*ǹ=^2���=$�M���D>��}��Y�=,g��M>��ü�0F�p����tb=+�;��!��o >� w��IZ> ��=4�����+A����>\��=�V>ܠb=��>v�>yx�=N^�=���=��Ž��`��Rk�=Vۣ�^{i>��)�ﷄ=�+���t�j����<W�=)�?����>5��<�y>�����p>�ѾA��>Sۑ� � ���'��)��,�w��SP�|���Qd>��������6��Žq���mއ�Z��=�Ћ>0���A�)�)S�r�:<ԟ��;��>�T�����$|��O�<7|�@�3I��c(>F`�>�:�� H=������K��������Q�3��r��V�C���a>���=��9���(>�.�=�J���������g�S.�>�V\��1x�,��B�;˅�=������w���3����=�D�
��3���[�>G:{�]��;� ���v���p��?b�����=w�=�������?��:G>�@��z>^��{�>ڢ����Ճ�r?�=��¾��I;�T�>�b?>�L˻^��>��>z���&3��WξK� >&˻h˘��⌾\�i:�x>Ӆ�>��>��-�5��ʓ;�.��\ƽ��=>�'$>�q��ރ��q�:��=N6,>u�=�(�������h��=f >*�-��ҽ��2��P\=�=�!E��X�=�Z���J�KЃ>��g�x���K<��6>򋤾EW>A�>m���a�a=�5о�zL>ά5=^y)=��c�|H=!�������b>< �V�>�Y5�X2��ӎ�� 7>���>p� �4���2���[��z�>B%�=��b>��=M�����轱���>�i���j;jм��>Y��=tY_�M�#��!>;!�>�Hc�N��=�鰽�j>ߖ!=�7t�U�g>�{>��I>� >tL�=�XֽN���> �K>+X�?\<wry��*�c@>�mN>�� �6��#Y�=�m"�K\*>�f��b���7m>�>ig7>�>G�;Wc�=(H:��-�>ظ3��r�=���>���<+>��=3{�>���|� ����o��>��7=c>/��M����=6�>.�7�-)��eN=��7>�bӽ���<S��=>Z�=�4���;<=��>0�K=��<�Z�= ��=��I��D���B&>~j�<F��=Z=�>���<{���gj�=�U�=��<� �=b~2=��J� �>�?>�h%����=ț�=> ���M���a���&�?�ǽ��]�ҿ�=�W�>�o���Z>
t�;��-=��?��]��"I�>hɀ�У>d "�8�+>���=nZ߽�>��^�3z>R�W�E�u<=�:���<8��=�e��)�y< G�<1g=�c/=����s*�Y��=� T>J����o>ԁ=�1>�m�=`^�=i�(>ᖜ���$>I����
~�|>�_+�pz-��=۽��=�ڼ�ٰ�=���8=$>z����>��y<P�"���w=�փ>�&��.= ��=F��.�i<�A����>}��pi�>��u��x<�49����>�� �[H�=DW�=�p���G>&((>�F�>gp�> 8��dѽ���=L�{��MҾۥ;L��=��D��� >?]��o"�u�d=1��>�}/���
�$��=E֞�w���T��=^��>�0�= ��=�$&����a��=� =Hh>KJ��RB�����=,Ҹ����=�疽!�4=)��>�\���M���o�\�->�_8����T�<>��>����!b=^n>��ƽD�C<3i�=Ҍ>h�L��A����?ʤQ=��=]>�_=�����0�=3�Q=`{���=�; �S<=� �D�O���\��7">���k��<nG����W>�1�>TV1>�i��}�����<X�~='{�="(����h>����9">E�O>}�a��x>&e��.�#>�=�;�=��H��W�D����=u�>k��F� >[����<���=6⑼0~`>n��>z3>_��L�*=�-�<�c��7����-���S^>J(x>kc�=��>��>\۽|?=k/=l��=/�=�R>�1>+4=�b������%g>��>46�Q�>f��
�8>�C�=+d7>\��=����7�=���=%o�=��>�9>���=�jk���%�������A��>�Q����@&���{>[1�==�9���<�+�>!1(>��{�����<aϽ?�b>/ћ>">ĿQ>�m�;k,�����u�>���=�k<��>_bV>�Ms���@>^z�=�T��Q�>)�,�S�u�;gI>�J�>)�>1�m��oH<�\<=S)�>{J�����=N��L�����Bғ�Zf=�R->[���8E<2��>j�M>�r�)���=$l'>n��<e��=џ�=�SH>�>�����T��M>�b��%��A��>&�c<�����<ܼ��\=���<�l��v� �����=`�=b�ҼL�<m�<�-P=��{>@�bd >Ut����=� = ��=��|���󼷽1=�o �I��_ >��=�%*=��>z����/=w��<��ľ��*>��=D#a=��ž�3��H=>4=��P�<~��=ŭp������:=+��>�^N�6&V:f��6�=��G�Vv���Y�G�=�~���˽fE�=�A@=/5~�:v���9>0t�>B��=o)#> A�}ȷ> �о��罸<�+�+=��ԃ�=zN)=� p>��ۻ�M7>4V��[�d=
 >���7����0Y�=\��<�1d��٥��51>�N�+cL=�ܞ<��M���=G´�����b��=+Z�>�(��J�>���}�A>\t<g6�=�����F�=gv��; ��R��ַ��W�
>F(>��.��!2>;�A=�-
�)�Ľ�1��f�=7��һ��A&-��L`�ע�>��Z��q���S�����=�Ͼ)�]��ռ9==�h�=ӆ>��&�3~�_�m���<>S��=���LD��.C=�u>����K����Z>��~�c��;i x���F��U)> ����>K�s=źT>���J������+�$��t���Z>����E�=���� �:?\����=��(�H4�>����P
A>�y�y>.�񘼽MO>Å=��">;m<�ԽiRg>er�=���=�?>�yJ��^ν �Ar�>B� ���:�ȸ=��d�d:�>T=/k�>�Ӹ=-�A>N!�=� ���k>1p/���4��|�=� ���<,"��v���B�"�=駖=��t=�wC=��S>�[ٽ*�M�m�r�)���? ]=���>)=&/`>
[
dense_3/kernel/readIdentitydense_3/kernel*
T0*!
_class
loc:@dense_3/kernel
�
dense_3/biasConst*
dtype0*�
value�B�@"��޻��e=5���m�=��x�6��ܑ�w������C�3�J���2z���-�=�N����*�����e<D�]>~_�={*�<� �=zi�����DyO=��=�l�<kh)= �(��Tw��z�����<͓��M�<݃<V��>3f��>4��t>�8C=`���{� >��<�Ѽ�񚻫y
=�OԼ�΂��8��d ����= �=���=�Y�=�@r=1��$�����K=��+��\�=����Q���\>
U
dense_3/bias/readIdentity dense_3/bias*
T0*
_class
loc:@dense_3/bias
j
dense_4/MatMulMatMul dense_3/Tanhdense_3/kernel/read*
transpose_a(*
transpose_b(*
T0
]
dense_4/BiasAddBiasAdddense_4/MatMuldense_3/bias/read*
T0*
data_formatNHWC
.
dense_4/TanhTanhdense_4/BiasAdd*
T0
3
dropout/IdentityIdentity dense_4/Tanh*
T0
�
dense_4/kernelConst*
dtype0*�
value�B�@"��ƕ�����b�<b�;�j���aQ=��0�D��J�X��!>v�m��YY�ķ��J1)<�v�<S��=�0:���$����=��=k(<ISȽp��=\N�<&��=�C���z���ۼ�pB�R�z������[��5��g���R��������E�4䕽Qޒ=�e�������;�j#����(V��;6�b=��<q^���J���=�'�<'2!�����<i�ɾ��)=��m=�Y[����< c�=n��<}�=泊� jս)��B����=�U&��S���ە=F{��� H�>�>��n�p�"=:�>OhP��N�=:k��h�&�O�=���=l�������^>��¼��=�w�<_?�:��J>&�;fr�d�������V>�P��r�;1�:�q�< ��;����謁�j�^l����a:4jR>0�>�}&<� �;����z*K=�ے=����=}�<� T;C�<u�~��t�=]c= �D=��3<����i7�=�'<B�;��q����=��k7ҽ�^Ѽ�9=�m�<��=<D8>�%�<�)�N柽�j�< �@<
̽ ܼ5`6���G�v<"p��0�A �F�H�i����
�[̽��N��l໑��=f�^�.d��;�y=��
=/���ku=���;��)#�r�=q�%<X�7=9f#��;���i�;�Pм�t�>���9���=���K�g=�i���*˽濦<`X=$�j�Fj�<�RU���>d =�����֥<�:���r���ѵ<�&�=
[
dense_4/kernel/readIdentitydense_4/kernel*
T0*!
_class
loc:@dense_4/kernel
n
dense_5/MatMulMatMuldropout/Identitydense_4/kernel/read*
transpose_a(*
transpose_b(*
T0
+
actionIdentitydense_5/MatMul*
T0

9
unity-environment/Assets/ML-Agents/Examples/Banana/TFModels/BananaI.bytes.meta


fileFormatVersion: 2
guid: db9ad5b2ab0ea40f5ba38cfbd819acb6
timeCreated: 1518442848
licenseType: Pro
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

37
python/unitytrainers/bc/bc_models.py


import tensorflow as tf
import tensorflow.contrib.layers as c_layers
from unitytrainers.models import LearningModel
class BehavioralCloningModel(LearningModel):
def __init__(self, h_size, lr, n_layers, m_size, normalize, use_recurrent, brain):
LearningModel.__init__(self, m_size, normalize, use_recurrent, brain)
num_streams = 1
hidden_streams = self.create_new_obs(num_streams, h_size, n_layers)
hidden = hidden_streams[0]
self.dropout_rate = tf.placeholder(dtype=tf.float32, shape=[], name="dropout_rate")
hidden_reg = tf.layers.dropout(hidden, self.dropout_rate)
if self.use_recurrent:
self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, name='recurrent_in')
hidden_reg, self.memory_out = self.create_recurrent_encoder(hidden_reg, self.memory_in)
self.memory_out = tf.identity(self.memory_out, name='recurrent_out')
self.policy = tf.layers.dense(hidden_reg, self.a_size, activation=None, use_bias=False,
kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))
if brain.action_space_type == "discrete":
self.action_probs = tf.nn.softmax(self.policy)
self.sample_action = tf.multinomial(self.policy, 1, name="action")
self.true_action = tf.placeholder(shape=[None], dtype=tf.int32)
self.action_oh = tf.one_hot(self.true_action, self.a_size)
self.loss = tf.reduce_sum(-tf.log(self.action_probs + 1e-10) * self.action_oh)
self.action_percent = tf.reduce_mean(tf.cast(
tf.equal(tf.cast(tf.argmax(self.action_probs, axis=1), tf.int32), self.sample_action), tf.float32))
else:
self.sample_action = tf.identity(self.policy, name="action")
self.true_action = tf.placeholder(shape=[None, self.a_size], dtype=tf.float32)
self.loss = tf.reduce_sum(tf.squared_difference(self.true_action, self.sample_action))
optimizer = tf.train.AdamOptimizer(learning_rate=lr)
self.update = optimizer.minimize(self.loss)

298
python/unitytrainers/bc/bc_trainer.py


# # Unity ML Agents
# ## ML-Agent Learning (Imitation)
# Contains an implementation of Behavioral Cloning Algorithm
import logging
import os
import numpy as np
import tensorflow as tf
from unitytrainers.bc.bc_models import BehavioralCloningModel
from unitytrainers.buffer import Buffer
from unitytrainers.trainer import UnityTrainerException, Trainer
logger = logging.getLogger("unityagents")
class BehavioralCloningTrainer(Trainer):
"""The ImitationTrainer is an implementation of the imitation learning."""
def __init__(self, sess, env, brain_name, trainer_parameters, training, seed):
"""
Responsible for collecting experiences and training PPO model.
:param sess: Tensorflow session.
:param env: The UnityEnvironment.
:param trainer_parameters: The parameters for the trainer (dictionary).
:param training: Whether the trainer is set for training.
"""
self.param_keys = ['brain_to_imitate', 'batch_size', 'time_horizon', 'graph_scope',
'summary_freq', 'max_steps', 'batches_per_epoch', 'use_recurrent', 'hidden_units',
'num_layers', 'sequence_length']
for k in self.param_keys:
if k not in trainer_parameters:
raise UnityTrainerException("The hyperparameter {0} could not be found for the Imitation trainer of "
"brain {1}.".format(k, brain_name))
super(BehavioralCloningTrainer, self).__init__(sess, env, brain_name, trainer_parameters, training)
self.variable_scope = trainer_parameters['graph_scope']
self.brain_to_imitate = trainer_parameters['brain_to_imitate']
self.batch_size = trainer_parameters['batch_size']
self.batches_per_epoch = trainer_parameters['batches_per_epoch']
self.use_recurrent = trainer_parameters['use_recurrent']
self.step = 0
self.sequence_length = 1
self.m_size = None
if self.use_recurrent:
self.m_size = env.brains[brain_name].memory_space_size
self.sequence_length = trainer_parameters["sequence_length"]
self.cumulative_rewards = {}
self.episode_steps = {}
self.stats = {'losses': [], 'episode_length': [], 'cumulative_reward': []}
self.training_buffer = Buffer()
self.is_continuous = (env.brains[brain_name].action_space_type == "continuous")
self.use_observations = (env.brains[brain_name].number_observations > 0)
if self.use_observations:
logger.info('Cannot use observations with imitation learning')
self.use_states = (env.brains[brain_name].state_space_size > 0)
self.summary_path = trainer_parameters['summary_path']
if not os.path.exists(self.summary_path):
os.makedirs(self.summary_path)
self.summary_writer = tf.summary.FileWriter(self.summary_path)
with tf.variable_scope(self.variable_scope):
tf.set_random_seed(seed)
self.model = BehavioralCloningModel(
h_size=int(trainer_parameters['hidden_units']),
lr=float(trainer_parameters['learning_rate']),
n_layers=int(trainer_parameters['num_layers']),
m_size=self.brain.memory_space_size,
normalize=False,
use_recurrent=trainer_parameters['use_recurrent'],
brain=self.brain)
def __str__(self):
return '''Hyperparameters for the Imitation Trainer of brain {0}: \n{1}'''.format(
self.brain_name, '\n'.join(['\t{0}:\t{1}'.format(x, self.trainer_parameters[x]) for x in self.param_keys]))
@property
def parameters(self):
"""
Returns the trainer parameters of the trainer.
"""
return self.trainer_parameters
@property
def graph_scope(self):
"""
Returns the graph scope of the trainer.
"""
return self.variable_scope
@property
def get_max_steps(self):
"""
Returns the maximum number of steps. Is used to know when the trainer should be stopped.
:return: The maximum number of steps of the trainer
"""
return float(self.trainer_parameters['max_steps'])
@property
def get_step(self):
"""
Returns the number of steps the trainer has performed
:return: the step count of the trainer
"""
return self.step
@property
def get_last_reward(self):
"""
Returns the last reward the trainer has had
:return: the new last reward
"""
if len(self.stats['cumulative_reward']) > 0:
return np.mean(self.stats['cumulative_reward'])
else:
return 0
def increment_step(self):
"""
Increment the step count of the trainer
"""
self.step += 1
def update_last_reward(self):
"""
Updates the last reward
"""
return
def take_action(self, all_brain_info):
"""
Decides actions given state/observation information, and takes them in environment.
:param info: Current BrainInfo from environment.
:return: a tupple containing action, memories, values and an object
to be passed to add experiences
"""
agent_brain = all_brain_info[self.brain_name]
feed_dict = {self.model.dropout_rate: 1.0, self.model.sequence_length: 1}
run_list = [self.model.sample_action]
if self.use_observations:
for i, _ in enumerate(agent_brain.observations):
feed_dict[self.model.observation_in[i]] = agent_brain.observations[i]
if self.use_states:
feed_dict[self.model.state_in] = agent_brain.states
if self.use_recurrent:
feed_dict[self.model.memory_in] = agent_brain.memories
run_list += [self.model.memory_out]
if self.use_recurrent:
agent_action, memories = self.sess.run(run_list, feed_dict)
return agent_action, memories, None, None
else:
agent_action = self.sess.run(run_list, feed_dict)
return agent_action, None, None, None
def add_experiences(self, info, next_info, take_action_outputs):
"""
Adds experiences to each agent's experience history.
:param info: Current BrainInfo.
:param next_info: Next BrainInfo.
:param take_action_outputs: The outputs of the take action method.
"""
info_expert = info[self.brain_to_imitate]
next_info_expert = next_info[self.brain_to_imitate]
for agent_id in info_expert.agents:
if agent_id in next_info_expert.agents:
idx = info_expert.agents.index(agent_id)
next_idx = next_info_expert.agents.index(agent_id)
if not info_expert.local_done[idx]:
if self.use_observations:
for i, _ in enumerate(info.observations):
self.training_buffer[agent_id]['observations%d' % i].append(info_expert.observations[i][idx])
if self.use_states:
self.training_buffer[agent_id]['states'].append(info_expert.states[idx])
if self.use_recurrent:
self.training_buffer[agent_id]['memory'].append(info_expert.memories[idx])
self.training_buffer[agent_id]['actions'].append(next_info_expert.previous_actions[next_idx])
info_student = next_info[self.brain_name]
next_info_student = next_info[self.brain_name]
for agent_id in info_student.agents:
idx = info_student.agents.index(agent_id)
next_idx = next_info_student.agents.index(agent_id)
if not info_student.local_done[idx]:
if agent_id not in self.cumulative_rewards:
self.cumulative_rewards[agent_id] = 0
self.cumulative_rewards[agent_id] += next_info_student.rewards[next_idx]
if agent_id not in self.episode_steps:
self.episode_steps[agent_id] = 0
self.episode_steps[agent_id] += 1
def process_experiences(self, info):
"""
Checks agent histories for processing condition, and processes them as necessary.
Processing involves calculating value and advantage targets for model updating step.
:param info: Current BrainInfo
"""
info_expert = info[self.brain_to_imitate]
for l in range(len(info_expert.agents)):
if ((info_expert.local_done[l] or
len(self.training_buffer[info_expert.agents[l]]['actions']) > self.trainer_parameters[
'time_horizon'])
and len(self.training_buffer[info_expert.agents[l]]['actions']) > 0):
agent_id = info_expert.agents[l]
self.training_buffer.append_update_buffer(agent_id, batch_size=None, training_length=self.sequence_length)
self.training_buffer[agent_id].reset_agent()
info_student = info[self.brain_name]
for l in range(len(info_student.agents)):
if info_student.local_done[l]:
agent_id = info_student.agents[l]
self.stats['cumulative_reward'].append(self.cumulative_rewards[agent_id])
self.stats['episode_length'].append(self.episode_steps[agent_id])
self.cumulative_rewards[agent_id] = 0
self.episode_steps[agent_id] = 0
def end_episode(self):
"""
A signal that the Episode has ended. The buffer must be reset.
Get only called when the academy resets.
"""
self.training_buffer.reset_all()
for agent_id in self.cumulative_rewards:
self.cumulative_rewards[agent_id] = 0
for agent_id in self.episode_steps:
self.episode_steps[agent_id] = 0
def is_ready_update(self):
"""
Returns whether or not the trainer has enough elements to run update model
:return: A boolean corresponding to whether or not update_model() can be run
"""
return len(self.training_buffer.update_buffer['actions']) > self.batch_size
def update_model(self):
"""
Uses training_buffer to update model.
"""
batch_size = self.trainer_parameters['batch_size']
self.training_buffer.update_buffer.shuffle()
batch_losses = []
for j in range(
min(len(self.training_buffer.update_buffer['actions']) // self.batch_size, self.batches_per_epoch)):
_buffer = self.training_buffer.update_buffer
start = j * batch_size
end = (j + 1) * batch_size
batch_states = np.array(_buffer['states'][start:end])
batch_actions = np.array(_buffer['actions'][start:end])
feed_dict = {self.model.true_action: batch_actions.reshape([-1, self.brain.action_space_size]),
self.model.dropout_rate: 0.5,
self.model.batch_size: batch_size,
self.model.sequence_length: self.sequence_length}
if not self.is_continuous:
feed_dict[self.model.state_in] = batch_states.reshape([-1, 1])
else:
feed_dict[self.model.state_in] = batch_states.reshape([-1, self.brain.state_space_size *
self.brain.stacked_states])
if self.use_observations:
for i, _ in enumerate(self.model.observation_in):
_obs = np.array(_buffer['observations%d' % i][start:end])
(_batch, _seq, _w, _h, _c) = _obs.shape
feed_dict[self.model.observation_in[i]] = _obs.reshape([-1, _w, _h, _c])
if self.use_recurrent:
feed_dict[self.model.memory_in] = np.zeros([batch_size, self.m_size])
loss, _ = self.sess.run([self.model.loss, self.model.update], feed_dict=feed_dict)
batch_losses.append(loss)
if len(batch_losses) > 0:
self.stats['losses'].append(np.mean(batch_losses))
else:
self.stats['losses'].append(0)
def write_summary(self, lesson_number):
"""
Saves training statistics to Tensorboard.
:param lesson_number: The lesson the trainer is at.
"""
if (self.get_step % self.trainer_parameters['summary_freq'] == 0 and self.get_step != 0 and
self.is_training and self.get_step <= self.get_max_steps):
steps = self.get_step
if len(self.stats['cumulative_reward']) > 0:
mean_reward = np.mean(self.stats['cumulative_reward'])
logger.info("{0} : Step: {1}. Mean Reward: {2}. Std of Reward: {3}."
.format(self.brain_name, steps, mean_reward, np.std(self.stats['cumulative_reward'])))
summary = tf.Summary()
for key in self.stats:
if len(self.stats[key]) > 0:
stat_mean = float(np.mean(self.stats[key]))
summary.value.add(tag='Info/{}'.format(key), simple_value=stat_mean)
self.stats[key] = []
summary.value.add(tag='Info/Lesson', simple_value=lesson_number)
self.summary_writer.add_summary(summary, steps)
self.summary_writer.flush()

234
python/unitytrainers/models.py


import logging
import numpy as np
import tensorflow as tf
import tensorflow.contrib.layers as c_layers
logger = logging.getLogger("unityagents")
class LearningModel(object):
def __init__(self, m_size, normalize, use_recurrent, brain):
self.brain = brain
self.state_in = None
self.normalize = False
self.use_recurrent = False
self.global_step, self.increment_step = self.create_global_steps()
self.observation_in = []
self.batch_size = tf.placeholder(shape=None, dtype=tf.int32, name='batch_size')
self.sequence_length = tf.placeholder(shape=None, dtype=tf.int32, name='sequence_length')
self.m_size = m_size
self.normalize = normalize
self.use_recurrent = use_recurrent
self.a_size = brain.action_space_size
@staticmethod
def create_global_steps():
"""Creates TF ops to track and increment global training step."""
global_step = tf.Variable(0, name="global_step", trainable=False, dtype=tf.int32)
increment_step = tf.assign(global_step, tf.add(global_step, 1))
return global_step, increment_step
@staticmethod
def create_visual_input(o_size_h, o_size_w, bw):
if bw:
c_channels = 1
else:
c_channels = 3
observation_in = tf.placeholder(shape=[None, o_size_h, o_size_w, c_channels], dtype=tf.float32)
return observation_in
def create_vector_input(self, s_size):
if self.brain.state_space_type == "continuous":
self.state_in = tf.placeholder(shape=[None, s_size], dtype=tf.float32, name='state')
if self.normalize:
self.running_mean = tf.get_variable("running_mean", [s_size], trainable=False, dtype=tf.float32,
initializer=tf.zeros_initializer())
self.running_variance = tf.get_variable("running_variance", [s_size], trainable=False, dtype=tf.float32,
initializer=tf.ones_initializer())
self.new_mean = tf.placeholder(shape=[s_size], dtype=tf.float32, name='new_mean')
self.new_variance = tf.placeholder(shape=[s_size], dtype=tf.float32, name='new_variance')
self.update_mean = tf.assign(self.running_mean, self.new_mean)
self.update_variance = tf.assign(self.running_variance, self.new_variance)
self.normalized_state = tf.clip_by_value((self.state_in - self.running_mean) / tf.sqrt(
self.running_variance / (tf.cast(self.global_step, tf.float32) + 1)), -5, 5,
name="normalized_state")
else:
self.normalized_state = self.state_in
else:
self.state_in = tf.placeholder(shape=[None, 1], dtype=tf.int32, name='state')
def create_continuous_state_encoder(self, h_size, activation, num_layers):
"""
Builds a set of hidden state encoders.
:param h_size: Hidden layer size.
:param activation: What type of activation function to use for layers.
:param num_layers: number of hidden layers to create.
:return: List of hidden layer tensors.
"""
hidden = self.normalized_state
for j in range(num_layers):
hidden = tf.layers.dense(hidden, h_size, activation=activation,
kernel_initializer=c_layers.variance_scaling_initializer(1.0))
return hidden
def create_visual_encoder(self, h_size, activation, num_layers):
"""
Builds a set of visual (CNN) encoders.
:param h_size: Hidden layer size.
:param activation: What type of activation function to use for layers.
:param num_layers: number of hidden layers to create.
:return: List of hidden layer tensors.
"""
conv1 = tf.layers.conv2d(self.observation_in[-1], 16, kernel_size=[8, 8], strides=[4, 4],
activation=tf.nn.elu)
conv2 = tf.layers.conv2d(conv1, 32, kernel_size=[4, 4], strides=[2, 2],
activation=tf.nn.elu)
hidden = c_layers.flatten(conv2)
for j in range(num_layers):
hidden = tf.layers.dense(hidden, h_size, use_bias=False, activation=activation)
return hidden
def create_discrete_state_encoder(self, s_size, h_size, activation, num_layers):
"""
Builds a set of hidden state encoders from discrete state input.
:param s_size: state input size (discrete).
:param h_size: Hidden layer size.
:param activation: What type of activation function to use for layers.
:param num_layers: number of hidden layers to create.
:return: List of hidden layer tensors.
"""
state_in = tf.reshape(self.state_in, [-1])
state_onehot = c_layers.one_hot_encoding(state_in, s_size)
hidden = state_onehot
for j in range(num_layers):
hidden = tf.layers.dense(hidden, h_size, use_bias=False, activation=activation)
return hidden
def create_new_obs(self, num_streams, h_size, num_layers):
brain = self.brain
s_size = brain.state_space_size * brain.stacked_states
if brain.action_space_type == "continuous":
activation_fn = tf.nn.tanh
else:
activation_fn = tf.nn.elu
self.observation_in = []
for i in range(brain.number_observations):
height_size, width_size = brain.camera_resolutions[i]['height'], brain.camera_resolutions[i]['width']
bw = brain.camera_resolutions[i]['blackAndWhite']
visual_input = self.create_visual_input(height_size, width_size, bw)
visual_input = tf.identity(visual_input, name="observation_in_" + str(i))
self.observation_in.append(visual_input)
self.create_vector_input(s_size)
final_hiddens = []
for i in range(num_streams):
visual_encoders = []
hidden_state, hidden_visual = None, None
if brain.number_observations > 0:
for j in range(brain.number_observations):
encoded_visual = self.create_visual_encoder(h_size, activation_fn, num_layers)
visual_encoders.append(encoded_visual)
hidden_visual = tf.concat(visual_encoders, axis=1)
if brain.state_space_size > 0:
s_size = brain.state_space_size * brain.stacked_states
if brain.state_space_type == "continuous":
hidden_state = self.create_continuous_state_encoder(h_size, activation_fn, num_layers)
else:
hidden_state = self.create_discrete_state_encoder(s_size, h_size,
activation_fn, num_layers)
if hidden_state is not None and hidden_visual is not None:
final_hidden = tf.concat([hidden_visual, hidden_state], axis=1)
elif hidden_state is None and hidden_visual is not None:
final_hidden = hidden_visual
elif hidden_state is not None and hidden_visual is None:
final_hidden = hidden_state
else:
raise Exception("No valid network configuration possible. "
"There are no states or observations in this brain")
final_hiddens.append(final_hidden)
return final_hiddens
def create_recurrent_encoder(self, input_state, memory_in, name='lstm'):
"""
Builds a recurrent encoder for either state or observations (LSTM).
:param input_state: The input tensor to the LSTM cell.
:param memory_in: The input memory to the LSTM cell.
:param name: The scope of the LSTM cell.
"""
s_size = input_state.get_shape().as_list()[1]
m_size = memory_in.get_shape().as_list()[1]
lstm_input_state = tf.reshape(input_state, shape=[-1, self.sequence_length, s_size])
_half_point = int(m_size / 2)
with tf.variable_scope(name):
rnn_cell = tf.contrib.rnn.BasicLSTMCell(_half_point)
lstm_state_in = tf.contrib.rnn.LSTMStateTuple(memory_in[:, :_half_point], memory_in[:, _half_point:])
recurrent_state, lstm_state_out = tf.nn.dynamic_rnn(rnn_cell, lstm_input_state,
initial_state=lstm_state_in,
time_major=False,
dtype=tf.float32)
recurrent_state = tf.reshape(recurrent_state, shape=[-1, _half_point])
return recurrent_state, tf.concat([lstm_state_out.c, lstm_state_out.h], axis=1)
def create_dc_actor_critic(self, h_size, num_layers):
num_streams = 1
hidden_streams = self.create_new_obs(num_streams, h_size, num_layers)
hidden = hidden_streams[0]
if self.use_recurrent:
self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, name='recurrent_in')
hidden, self.memory_out = self.create_recurrent_encoder(hidden, self.memory_in)
self.memory_out = tf.identity(self.memory_out, name='recurrent_out')
self.policy = tf.layers.dense(hidden, self.a_size, activation=None, use_bias=False,
kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))
self.all_probs = tf.nn.softmax(self.policy, name="action_probs")
self.output = tf.multinomial(self.policy, 1)
self.output = tf.identity(self.output, name="action")
self.value = tf.layers.dense(hidden, 1, activation=None)
self.value = tf.identity(self.value, name="value_estimate")
self.entropy = -tf.reduce_sum(self.probs * tf.log(self.probs + 1e-10), axis=1)
self.action_holder = tf.placeholder(shape=[None], dtype=tf.int32)
self.selected_actions = c_layers.one_hot_encoding(self.action_holder, self.a_size)
self.all_old_probs = tf.placeholder(shape=[None, self.a_size], dtype=tf.float32, name='old_probabilities')
self.probs = tf.reduce_sum(self.probs * self.selected_actions, axis=1)
self.old_probs = tf.reduce_sum(self.old_probs * self.selected_actions, axis=1)
def create_cc_actor_critic(self, h_size, num_layers):
num_streams = 2
hidden_streams = self.create_new_obs(num_streams, h_size, num_layers)
if self.use_recurrent:
self.memory_in = tf.placeholder(shape=[None, self.m_size], dtype=tf.float32, name='recurrent_in')
_half_point = int(self.m_size / 2)
hidden_policy, memory_policy_out = self.create_recurrent_encoder(
hidden_streams[0], self.memory_in[:, :_half_point], name='lstm_policy')
hidden_value, memory_value_out = self.create_recurrent_encoder(
hidden_streams[1], self.memory_in[:, _half_point:], name='lstm_value')
self.memory_out = tf.concat([memory_policy_out, memory_value_out], axis=1, name='recurrent_out')
hidden_policy = hidden_streams[0]
hidden_value = hidden_streams[1]
self.mu = tf.layers.dense(hidden_policy, self.a_size, activation=None, use_bias=False,
kernel_initializer=c_layers.variance_scaling_initializer(factor=0.01))
self.log_sigma_sq = tf.get_variable("log_sigma_squared", [self.a_size], dtype=tf.float32,
initializer=tf.zeros_initializer())
self.sigma_sq = tf.exp(self.log_sigma_sq)
self.epsilon = tf.random_normal(tf.shape(self.mu), dtype=tf.float32)
self.output = self.mu + tf.sqrt(self.sigma_sq) * self.epsilon
self.output = tf.identity(self.output, name='action')
a = tf.exp(-1 * tf.pow(tf.stop_gradient(self.output) - self.mu, 2) / (2 * self.sigma_sq))
b = 1 / tf.sqrt(2 * self.sigma_sq * np.pi)
self.probs = tf.multiply(a, b, name="action_probs")
self.entropy = tf.reduce_sum(0.5 * tf.log(2 * np.pi * np.e * self.sigma_sq))
self.value = tf.layers.dense(hidden_value, 1, activation=None)
self.value = tf.identity(self.value, name="value_estimate")
self.all_old_probs = tf.placeholder(shape=[None, self.a_size], dtype=tf.float32,
name='old_probabilities')
self.old_probs = tf.identity(self.all_old_probs)

73
python/unitytrainers/ppo/ppo_models.py


import logging
import tensorflow as tf
from unitytrainers.models import LearningModel
logger = logging.getLogger("unityagents")
class PPOModel(LearningModel):
def __init__(self, brain, lr=1e-4, h_size=128, epsilon=0.2, beta=1e-3, max_step=5e6,
normalize=False, use_recurrent=False, num_layers=2, m_size=None):
"""
Takes a Unity environment and model-specific hyper-parameters and returns the
appropriate PPO agent model for the environment.
:param brain: BrainInfo used to generate specific network graph.
:param lr: Learning rate.
:param h_size: Size of hidden layers/
:param epsilon: Value for policy-divergence threshold.
:param beta: Strength of entropy regularization.
:return: a sub-class of PPOAgent tailored to the environment.
:param max_step: Total number of training steps.
:param normalize: Whether to normalize vector observation input.
:param use_recurrent: Whether to use an LSTM layer in the network.
:param num_layers Number of hidden layers between encoded input and policy & value layers
:param m_size: Size of brain memory.
"""
LearningModel.__init__(self, m_size, normalize, use_recurrent, brain)
if num_layers < 1:
num_layers = 1
self.last_reward, self.new_reward, self.update_reward = self.create_reward_encoder()
if brain.action_space_type == "continuous":
self.create_cc_actor_critic(h_size, num_layers)
else:
self.create_dc_actor_critic(h_size, num_layers)
self.create_ppo_optimizer(self.probs, self.old_probs, self.value,
self.entropy, beta, epsilon, lr, max_step)
@staticmethod
def create_reward_encoder():
"""Creates TF ops to track and increment recent average cumulative reward."""
last_reward = tf.Variable(0, name="last_reward", trainable=False, dtype=tf.float32)
new_reward = tf.placeholder(shape=[], dtype=tf.float32, name='new_reward')
update_reward = tf.assign(last_reward, new_reward)
return last_reward, new_reward, update_reward
def create_ppo_optimizer(self, probs, old_probs, value, entropy, beta, epsilon, lr, max_step):
"""
Creates training-specific Tensorflow ops for PPO models.
:param probs: Current policy probabilities
:param old_probs: Past policy probabilities
:param value: Current value estimate
:param beta: Entropy regularization strength
:param entropy: Current policy entropy
:param epsilon: Value for policy-divergence threshold
:param lr: Learning rate
:param max_step: Total number of training steps.
"""
self.returns_holder = tf.placeholder(shape=[None], dtype=tf.float32, name='discounted_rewards')
self.advantage = tf.placeholder(shape=[None, 1], dtype=tf.float32, name='advantages')
self.learning_rate = tf.train.polynomial_decay(lr, self.global_step, max_step, 1e-10, power=1.0)
decay_epsilon = tf.train.polynomial_decay(epsilon, self.global_step, max_step, 0.1, power=1.0)
decay_beta = tf.train.polynomial_decay(beta, self.global_step, max_step, 1e-5, power=1.0)
optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
r_theta = probs / (old_probs + 1e-10)
p_opt_a = r_theta * self.advantage
p_opt_b = tf.clip_by_value(r_theta, 1 - decay_epsilon, 1 + decay_epsilon) * self.advantage
self.policy_loss = -tf.reduce_mean(tf.minimum(p_opt_a, p_opt_b))
self.value_loss = tf.reduce_mean(tf.squared_difference(self.returns_holder, tf.reduce_sum(value, axis=1)))
self.loss = self.policy_loss + 0.5 * self.value_loss - decay_beta * tf.reduce_mean(entropy)
self.update_batch = optimizer.minimize(self.loss)

234
python/unitytrainers/trainer_controller.py


# # Unity ML Agents
# ## ML-Agent Learning
# Launches unitytrainers for each External Brains in a Unity Environment
import logging
import numpy as np
import os
import re
import tensorflow as tf
import yaml
from datetime import datetime
from tensorflow.python.tools import freeze_graph
from unitytrainers.ppo.ppo_trainer import PPOTrainer
from unitytrainers.bc.bc_trainer import BehavioralCloningTrainer
from unityagents import UnityEnvironment, UnityEnvironmentException
class TrainerController(object):
def __init__(self, env_name, run_id, save_freq, curriculum_file, fast_simulation, load, train,
worker_id, keep_checkpoints, lesson, seed):
self.model_path = './models/{}'.format(run_id)
self.logger = logging.getLogger("unityagents")
self.run_id = run_id
self.save_freq = save_freq
self.curriculum_file = curriculum_file
self.lesson = lesson
self.fast_simulation = fast_simulation
self.load_model = load
self.train_model = train
self.worker_id = worker_id
self.keep_checkpoints = keep_checkpoints
self.trainers = {}
if seed == -1:
seed = np.random.randint(0, 999999)
self.seed = seed
np.random.seed(self.seed)
tf.set_random_seed(self.seed)
self.env = UnityEnvironment(file_name=env_name, worker_id=self.worker_id,
curriculum=self.curriculum_file, seed=self.seed)
self.env_name = (env_name.strip().replace('.app', '').replace('.exe', '').replace('.x86_64', '')
.replace('.x86', ''))
self.env_name = os.path.basename(os.path.normpath(self.env_name))
def _get_progress(self):
if self.curriculum_file is not None:
if self.env.curriculum.measure_type == "progress":
progress = 0
for brain_name in self.env.external_brain_names:
progress += self.trainers[brain_name].get_step / self.trainers[brain_name].get_max_steps
return progress / len(self.env.external_brain_names)
elif self.env.curriculum.measure_type == "reward":
progress = 0
for brain_name in self.env.external_brain_names:
progress += self.trainers[brain_name].get_last_reward
return progress
else:
return None
else:
return None
def _process_graph(self):
nodes = []
scopes = []
for brain_name in self.trainers.keys():
if self.trainers[brain_name].graph_scope is not None:
scope = self.trainers[brain_name].graph_scope + '/'
if scope == '/':
scope = ''
scopes += [scope]
if self.trainers[brain_name].parameters["trainer"] == "imitation":
nodes += [scope + x for x in ["action"]]
elif not self.trainers[brain_name].parameters["use_recurrent"]:
nodes += [scope + x for x in ["action", "value_estimate", "action_probs"]]
else:
nodes += [scope + x for x in ["action", "value_estimate", "action_probs", "recurrent_out"]]
if len(scopes) > 1:
self.logger.info("List of available scopes :")
for scope in scopes:
self.logger.info("\t" + scope)
self.logger.info("List of nodes to export :")
for n in nodes:
self.logger.info("\t" + n)
return nodes
def _save_model(self, sess, saver, model_path="./", steps=0):
"""
Saves current model to checkpoint folder.
:param sess: Current Tensorflow session.
:param model_path: Designated model path.
:param steps: Current number of steps in training process.
:param saver: Tensorflow saver for session.
"""
last_checkpoint = model_path + '/model-' + str(steps) + '.cptk'
saver.save(sess, last_checkpoint)
tf.train.write_graph(sess.graph_def, model_path, 'raw_graph_def.pb', as_text=False)
self.logger.info("Saved Model")
def _export_graph(self):
"""
Exports latest saved model to .bytes format for Unity embedding.
"""
target_nodes = ','.join(self._process_graph())
ckpt = tf.train.get_checkpoint_state(self.model_path)
freeze_graph.freeze_graph(input_graph=self.model_path + '/raw_graph_def.pb',
input_binary=True,
input_checkpoint=ckpt.model_checkpoint_path,
output_node_names=target_nodes,
output_graph=self.model_path + '/' + self.env_name + "_" + self.run_id + '.bytes',
clear_devices=True, initializer_nodes="", input_saver="",
restore_op_name="save/restore_all", filename_tensor_name="save/Const:0")
def _initialize_trainers(self, trainer_config, sess):
trainer_parameters_dict = {}
for brain_name in self.env.external_brain_names:
trainer_parameters = trainer_config['default'].copy()
if len(self.env.external_brain_names) > 1:
graph_scope = re.sub('[^0-9a-zA-Z]+', '-', brain_name)
trainer_parameters['graph_scope'] = graph_scope
trainer_parameters['summary_path'] = './summaries/{}'.format(
str(self.run_id)) + '_' + graph_scope
else:
trainer_parameters['graph_scope'] = ''
trainer_parameters['summary_path'] = './summaries/{}'.format(self.run_id)
if brain_name in trainer_config:
_brain_key = brain_name
while not isinstance(trainer_config[_brain_key], dict):
_brain_key = trainer_config[_brain_key]
for k in trainer_config[_brain_key]:
trainer_parameters[k] = trainer_config[_brain_key][k]
trainer_parameters_dict[brain_name] = trainer_parameters.copy()
for brain_name in self.env.external_brain_names:
if trainer_parameters_dict[brain_name]['trainer'] == "imitation":
self.trainers[brain_name] = BehavioralCloningTrainer(sess, self.env, brain_name,
trainer_parameters_dict[brain_name],
self.train_model, self.seed)
elif trainer_parameters_dict[brain_name]['trainer'] == "ppo":
self.trainers[brain_name] = PPOTrainer(sess, self.env, brain_name, trainer_parameters_dict[brain_name],
self.train_model, self.seed)
else:
raise UnityEnvironmentException("The trainer config contains an unknown trainer type for brain {}"
.format(brain_name))
def start_learning(self):
self.env.curriculum.set_lesson_number(self.lesson)
self.logger.info(str(self.env))
tf.reset_default_graph()
try:
with open("trainer_config.yaml") as data_file:
trainer_config = yaml.load(data_file)
except IOError:
raise UnityEnvironmentException("The file {} could not be found. Will use default Hyperparameters"
.format("trainer_config.yaml"))
except UnicodeDecodeError:
raise UnityEnvironmentException("There was an error decoding {}".format("trainer_config.yaml"))
try:
if not os.path.exists(self.model_path):
os.makedirs(self.model_path)
except Exception:
raise UnityEnvironmentException("The folder {} containing the generated model could not be accessed."
" Please make sure the permissions are set correctly."
.format(self.model_path))
with tf.Session() as sess:
self._initialize_trainers(trainer_config, sess)
for k, t in self.trainers.items():
self.logger.info(t)
init = tf.global_variables_initializer()
saver = tf.train.Saver(max_to_keep=self.keep_checkpoints)
# Instantiate model parameters
if self.load_model:
self.logger.info('Loading Model...')
ckpt = tf.train.get_checkpoint_state(self.model_path)
if ckpt is None:
self.logger.info('The model {0} could not be found. Make sure you specified the right '
'--run-id'.format(self.model_path))
saver.restore(sess, ckpt.model_checkpoint_path)
else:
sess.run(init)
global_step = 0 # This is only for saving the model
self.env.curriculum.increment_lesson(self._get_progress())
info = self.env.reset(train_mode=self.fast_simulation)
if self.train_model:
for brain_name, trainer in self.trainers.items():
trainer.write_tensorboard_text('Hyperparameters', trainer.parameters)
try:
while any([t.get_step <= t.get_max_steps for k, t in self.trainers.items()]) or not self.train_model:
if self.env.global_done:
self.env.curriculum.increment_lesson(self._get_progress())
info = self.env.reset(train_mode=self.fast_simulation)
for brain_name, trainer in self.trainers.items():
trainer.end_episode()
# Decide and take an action
take_action_actions, take_action_memories, take_action_values, take_action_outputs = {}, {}, {}, {}
for brain_name, trainer in self.trainers.items():
(take_action_actions[brain_name],
take_action_memories[brain_name],
take_action_values[brain_name],
take_action_outputs[brain_name]) = trainer.take_action(info)
new_info = self.env.step(action=take_action_actions, memory=take_action_memories,
value=take_action_values)
for brain_name, trainer in self.trainers.items():
trainer.add_experiences(info, new_info, take_action_outputs[brain_name])
info = new_info
for brain_name, trainer in self.trainers.items():
trainer.process_experiences(info)
if trainer.is_ready_update() and self.train_model and trainer.get_step <= trainer.get_max_steps:
# Perform gradient descent with experience buffer
trainer.update_model()
# Write training statistics to tensorboard.
trainer.write_summary(self.env.curriculum.lesson_number)
if self.train_model and trainer.get_step <= trainer.get_max_steps:
trainer.increment_step()
trainer.update_last_reward()
if self.train_model and trainer.get_step <= trainer.get_max_steps:
global_step += 1
if global_step % self.save_freq == 0 and global_step != 0 and self.train_model:
# Save Tensorflow model
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
# Final save Tensorflow model
if global_step != 0 and self.train_model:
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
except KeyboardInterrupt:
if self.train_model:
self.logger.info("Learning was interrupted. Please wait while the graph is generated.")
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
pass
self.env.close()
if self.train_model:
self._export_graph()

248
python/trainer_controller.py


# # Unity ML Agents
# ## ML-Agent Learning
# Launches trainers for each External Brains in a Unity Environment
import logging
import numpy as np
import os
import re
import tensorflow as tf
import yaml
from datetime import datetime
from tensorflow.python.tools import freeze_graph
from trainers.ghost_trainer import GhostTrainer
from trainers.ppo_trainer import PPOTrainer
from trainers.imitation_trainer import ImitationTrainer
from unityagents import UnityEnvironment, UnityEnvironmentException
class TrainerController(object):
def __init__(self, env_name, run_id, save_freq, curriculum_file, fast_simulation, load, train,
worker_id, keep_checkpoints, lesson, seed):
self.model_path = './models/{}'.format(run_id)
self.logger = logging.getLogger("unityagents")
self.run_id = run_id
self.save_freq = save_freq
self.curriculum_file = curriculum_file
self.lesson = lesson
self.fast_simulation = fast_simulation
self.load_model = load
self.train_model = train
self.worker_id = worker_id
self.keep_checkpoints = keep_checkpoints
self.trainers = {}
if seed is None:
seed = datetime.now()
self.seed = seed
np.random.seed(self.seed)
tf.set_random_seed(self.seed)
self.env = UnityEnvironment(file_name=env_name, worker_id=self.worker_id,
curriculum=self.curriculum_file, seed=self.seed)
self.env_name = (env_name.strip().replace('.app', '').replace('.exe', '').replace('.x86_64', '')
.replace('.x86', ''))
self.env_name = os.path.basename(os.path.normpath(self.env_name))
def _get_progress(self):
if self.curriculum_file is not None:
if self.env.curriculum.measure_type == "progress":
progress = 0
for brain_name in self.env.external_brain_names:
progress += self.trainers[brain_name].get_step / self.trainers[brain_name].get_max_steps
return progress / len(self.env.external_brain_names)
elif self.env.curriculum.measure_type == "reward":
progress = 0
for brain_name in self.env.external_brain_names:
progress += self.trainers[brain_name].get_last_reward
return progress
else:
return None
else:
return None
def _process_graph(self):
nodes = []
scopes = []
for brain_name in self.trainers.keys():
if self.trainers[brain_name].graph_scope is not None:
scope = self.trainers[brain_name].graph_scope + '/'
if scope == '/':
scope = ''
scopes += [scope]
if self.trainers[brain_name].parameters["is_imitation"]:
nodes += [scope + x for x in ["action"]]
elif not self.trainers[brain_name].parameters["use_recurrent"]:
nodes += [scope + x for x in ["action", "value_estimate", "action_probs"]]
else:
nodes += [scope + x for x in ["action", "value_estimate", "action_probs", "recurrent_out"]]
if len(scopes) > 1:
self.logger.info("List of available scopes :")
for scope in scopes:
self.logger.info("\t" + scope)
self.logger.info("List of nodes to export :")
for n in nodes:
self.logger.info("\t" + n)
return nodes
def _save_model(self, sess, saver, model_path="./", steps=0):
"""
Saves current model to checkpoint folder.
:param sess: Current Tensorflow session.
:param model_path: Designated model path.
:param steps: Current number of steps in training process.
:param saver: Tensorflow saver for session.
"""
last_checkpoint = model_path + '/model-' + str(steps) + '.cptk'
saver.save(sess, last_checkpoint)
tf.train.write_graph(sess.graph_def, model_path, 'raw_graph_def.pb', as_text=False)
self.logger.info("Saved Model")
def _export_graph(self):
"""
Exports latest saved model to .bytes format for Unity embedding.
"""
target_nodes = ','.join(self._process_graph())
ckpt = tf.train.get_checkpoint_state(self.model_path)
freeze_graph.freeze_graph(input_graph=self.model_path + '/raw_graph_def.pb',
input_binary=True,
input_checkpoint=ckpt.model_checkpoint_path,
output_node_names=target_nodes,
output_graph=self.model_path + '/' + self.env_name + "_" + self.run_id + '.bytes',
clear_devices=True, initializer_nodes="", input_saver="",
restore_op_name="save/restore_all", filename_tensor_name="save/Const:0")
def _initialize_trainers(self, trainer_config, sess):
trainer_parameters_dict = {}
for brain_name in self.env.external_brain_names:
trainer_parameters = trainer_config['default'].copy()
if len(self.env.external_brain_names) > 1:
graph_scope = re.sub('[^0-9a-zA-Z]+', '-', brain_name)
trainer_parameters['graph_scope'] = graph_scope
trainer_parameters['summary_path'] = './summaries/{}'.format(
str(self.run_id)) + '_' + graph_scope
else:
trainer_parameters['graph_scope'] = ''
trainer_parameters['summary_path'] = './summaries/{}'.format(self.run_id)
if brain_name in trainer_config:
_brain_key = brain_name
while not isinstance(trainer_config[_brain_key], dict):
_brain_key = trainer_config[_brain_key]
for k in trainer_config[_brain_key]:
trainer_parameters[k] = trainer_config[_brain_key][k]
trainer_parameters_dict[brain_name] = trainer_parameters.copy()
for brain_name in self.env.external_brain_names:
if 'is_ghost' not in trainer_parameters_dict[brain_name]:
trainer_parameters_dict[brain_name]['is_ghost'] = False
if 'is_imitation' not in trainer_parameters_dict[brain_name]:
trainer_parameters_dict[brain_name]['is_imitation'] = False
if trainer_parameters_dict[brain_name]['is_ghost']:
if trainer_parameters_dict[brain_name]['brain_to_copy'] not in self.env.external_brain_names:
raise UnityEnvironmentException(
"The external brain {0} could not be found in the environment "
"even though the ghost trainer of brain {1} is trying to ghost it."
.format(trainer_parameters_dict[brain_name]['brain_to_copy'],
brain_name))
trainer_parameters_dict[brain_name]['original_brain_parameters'] = trainer_parameters_dict[
trainer_parameters_dict[brain_name]['brain_to_copy']]
self.trainers[brain_name] = GhostTrainer(sess, self.env, brain_name,
trainer_parameters_dict[brain_name],
self.train_model, self.seed)
elif trainer_parameters_dict[brain_name]['is_imitation']:
self.trainers[brain_name] = ImitationTrainer(sess, self.env, brain_name,
trainer_parameters_dict[brain_name],
self.train_model, self.seed)
else:
self.trainers[brain_name] = PPOTrainer(sess, self.env, brain_name, trainer_parameters_dict[brain_name],
self.train_model, self.seed)
def start_learning(self):
self.env.curriculum.set_lesson_number(self.lesson)
self.logger.info(str(self.env))
tf.reset_default_graph()
try:
with open("trainer_config.yaml") as data_file:
trainer_config = yaml.load(data_file)
except IOError:
raise UnityEnvironmentException("The file {} could not be found. Will use default Hyperparameters"
.format("trainer_config.yaml"))
except UnicodeDecodeError:
raise UnityEnvironmentException("There was an error decoding {}".format("trainer_config.yaml"))
try:
if not os.path.exists(self.model_path):
os.makedirs(self.model_path)
except Exception:
raise UnityEnvironmentException("The folder {} containing the generated model could not be accessed."
" Please make sure the permissions are set correctly."
.format(self.model_path))
with tf.Session() as sess:
self._initialize_trainers(trainer_config, sess)
for k, t in self.trainers.items():
self.logger.info(t)
init = tf.global_variables_initializer()
saver = tf.train.Saver(max_to_keep=self.keep_checkpoints)
# Instantiate model parameters
if self.load_model:
self.logger.info('Loading Model...')
ckpt = tf.train.get_checkpoint_state(self.model_path)
if ckpt is None:
self.logger.info('The model {0} could not be found. Make sure you specified the right '
'--run-id'.format(self.model_path))
saver.restore(sess, ckpt.model_checkpoint_path)
else:
sess.run(init)
global_step = 0 # This is only for saving the model
self.env.curriculum.increment_lesson(self._get_progress())
info = self.env.reset(train_mode=self.fast_simulation)
if self.train_model:
for brain_name, trainer in self.trainers.items():
trainer.write_tensorboard_text('Hyperparameters', trainer.parameters)
try:
while any([t.get_step <= t.get_max_steps for k, t in self.trainers.items()]) or not self.train_model:
if self.env.global_done:
self.env.curriculum.increment_lesson(self._get_progress())
info = self.env.reset(train_mode=self.fast_simulation)
for brain_name, trainer in self.trainers.items():
trainer.end_episode()
# Decide and take an action
take_action_actions, take_action_memories, take_action_values, take_action_outputs = {}, {}, {}, {}
for brain_name, trainer in self.trainers.items():
(take_action_actions[brain_name],
take_action_memories[brain_name],
take_action_values[brain_name],
take_action_outputs[brain_name]) = trainer.take_action(info)
new_info = self.env.step(action=take_action_actions, memory=take_action_memories,
value=take_action_values)
for brain_name, trainer in self.trainers.items():
trainer.add_experiences(info, new_info, take_action_outputs[brain_name])
info = new_info
for brain_name, trainer in self.trainers.items():
trainer.process_experiences(info)
if trainer.is_ready_update() and self.train_model and trainer.get_step <= trainer.get_max_steps:
# Perform gradient descent with experience buffer
trainer.update_model()
# Write training statistics to tensorboard.
trainer.write_summary(self.env.curriculum.lesson_number)
if self.train_model and trainer.get_step <= trainer.get_max_steps:
trainer.increment_step()
trainer.update_last_reward()
if self.train_model and trainer.get_step <= trainer.get_max_steps:
global_step += 1
if global_step % self.save_freq == 0 and global_step != 0 and self.train_model:
# Save Tensorflow model
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
# Final save Tensorflow model
if global_step != 0 and self.train_model:
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
except KeyboardInterrupt:
if self.train_model:
self.logger.info("Learning was interrupted. Please wait while the graph is generated.")
self._save_model(sess, model_path=self.model_path, steps=global_step, saver=saver)
pass
self.env.close()
if self.train_model:
self._export_graph()

1001
unity-environment/Assets/ML-Agents/Examples/Banana/Banana.unity
文件差异内容过多而无法显示
查看文件

/unity-environment/Assets/ML-Agents/Examples/Banana/Banana.unity.meta → /unity-environment/Assets/ML-Agents/Examples/Banana/BananaRL.unity.meta

/python/trainers/buffer.py → /python/unitytrainers/buffer.py

/python/trainers/ppo_trainer.py → /python/unitytrainers/ppo/ppo_trainer.py

/python/trainers/trainer.py → /python/unitytrainers/trainer.py

正在加载...
取消
保存